【发布时间】:2016-11-17 10:26:29
【问题描述】:
我使用的是 MySQL 5.6,在一些非常大的表中的查询性能遇到了一些问题。具体来说,当表之间同时存在引用以及 in() 条件时,我不确定如何正确索引我的表。
简化表如下(A和B都是大表,C是20行左右的小表,所有表都是InnoDB)
A(id int, created datetime, val int)
B(id int, a_id int, c_id int)
C(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 )
我在 A 上创建了一个索引为 (val, created, id),在 B 上创建了一个索引为 (c_id, a_id),当 c_id 上存在“=”条件时效果很好(例如 c_id = 5)但是解释的“in()”条件告诉我,我在 A 上的索引没有被使用,而是它正在使用主键索引,并且这个查询将永远持续下去。强制使用我的索引似乎也无济于事。
关于如何更好地索引或以其他方式提高此类查询的性能的任何提示或想法?
【问题讨论】: