2015-12-31 107 views
-2

我有以下MySQL查詢這需要長的時間MySQL查詢承擔加入長時間

SELECT `A`.*, max(B.timestamp) as timestamp2 
FROM (`A`) 
JOIN `B` ON `A`.`column1` = `B`.`column1` 
WHERE `column2` = 'Player' 
GROUP BY `column1` 
ORDER BY `timestamp2` desc 

我有表A指數列1和表B中的索引是(列1,時間戳,列2),時間戳列1。

當我使用EXPLAIN它不使用時間戳索引。

+0

我在MySQL的優化器遇到麻煩之前沒有使用(更喜歡)時間戳索引。你有沒有嘗試[給它提示](http://dev.mysql.com/doc/refman/5.7/en/index-hints.html)? –

回答

1

嘗試添加索引...

... ON `B` (`column2`,`column1`,`timestamp`) 

用的順序列。

沒有有關數據類型的任何信息,我們要猜測column2是字符類型(以及我們要假定列在表B,給出關於當前索引信息。)

如果缺少有關基數的任何信息,我們將猜測column2(在WHERE子句中)滿足等於謂詞的行數是B中總行數的一小部分。

我們預計MySQL將使用「範圍」掃描操作,使用具有column2的索引作爲主要列。

鑑於新索引是查詢的「覆蓋」索引,我們還希望EXPLAIN輸出在Extra列中顯示「使用索引」。

我們也希望MySQL可以使用索引來滿足GROUP BY操作和MAX聚合,而不需要文件操作。

但我們仍然會看到用於滿足ORDER BY的文件操作。