我正在使用MySQL 5.6,並且在某些非常大的表中遇到了一些查詢性能問題。具體而言,我不確定如何在表格之間同時存在引用以及in()條件時正確索引表格。使用外鍵和範圍進行查詢的索引設計
簡化表如下所示(A和B都是巨大的表,而C是一個小桌子與大約20行,所有的表是InnoDB的)
甲(ID INT,創建日期時間,VAL INT)
乙(ID INT,A_ID INT,C_ID INT)
ç(ID INT,VAL INT)
查詢有問題看起來是這樣的:
Select a.id
from a
join b ON (a.id = b.a_id)
where a.created >= now() - interval 90 day
and a.val = 0
and b.c_id in (
SELECT id
from c
where val = 1)
我已經創建了一個索引爲(VAL,創建ID),一個在B中(C_ID,A_ID),它的偉大工程時,有一個「 ='condition on c_id(例如,c_id = 5)但是使用'in()'條件解釋告訴我,我的A上的索引沒有被使用,而是使用主鍵索引,並且此查詢正在永久。強制使用我的索引似乎也沒有幫助。
有關如何更好地索引此索引或以其他方式提高此類查詢性能的任何提示或想法?
非常感謝您的幫助。看起來優化器並不總是在同一頁面上,但它涉及到要使用哪個索引。使用這些新索引,查詢運行速度要快得多,但是我必須明確告訴它使用它們,否則它仍會嘗試使用主鍵在需要年齡的A上。 –