我正在使用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上。 –