天天看點

STRAIGHT_JOIN has no effect on query with subquery in FROM clause

上周的mysql官網上送出了一個bug,原因為在我們的一個分頁sql中出現了全表掃描的情況,這對于我們來說是不可接受的:

+—-+————-+————+——–+———————+———+———+——+——–+—————-+

| id | select_type | table      | type   | possible_keys       | key     | key_len | ref  | rows   | extra

 |+—-+————-+————+——–+———————+———+———+——+——–+—————-+

|  1 | primary     | <derived2> | all    | null                | null    | null    | null |      9 |                |

|  1 | primary     | t          | eq_ref | primary             | primary | 8       | g.id |      1 |                |

|  2 | derived     | g          | all    | ind_group_type_time | null    | null    | null | 652469 | using filesort

|+—-+————-+————+——–+———————+———+———+——+——–+——–

3 rows in set (0.54 sec)

可以看到在内查詢中即使加入了force index 也沒有上查詢走上索引,而是走了全表掃,如果将其單獨拿出來執行,而不做關聯查詢的話,是可以用上覆寫索引:

+—-+————-+——-+——-+———————+———————+——–

| id | select_type | table | type  | possible_keys       | key                 | key_len | ref  | rows   ||

|  1 | simple      | g     | range | ind_group_type_time | ind_group_type_time | 9       | null | 326235 | using where; using index; using filesort |

+—-+————-+——-+——-+———————+———————+——-

在和官網的valeriy kravchuk多次溝通後,最終認為這是一個bug;最後解決的辦法是調整索引,來避免排序的,這樣就能夠使用覆寫索引索引:

是以大家對這種類型的分頁語句一定多加注意,由于排序導緻全表掃描的問題;