A是数据表共有30万条数据,b,c,d 是字段,我给b和c,d分别加了index索引
执行
EXPLAIN SELECT * FROM A WHERE b=0 AND c='hk' ORDER BY d DESC LIMIT 1,30
用时41.7ms(实际体验很慢)
结果:
select_type | table | type | possible_key | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|
SIMPLE | A | index_merge | b,c | b,c | 6,4 | NULL | 55577 | Using intersect(region,cheat); Using where; Using filesort |
请问我该怎么优化
你的type是index_merge类型的,意味着你的sql是先用b的索引查找b=0的数据,然后在用c的索引查找c='hk'的的项,然后取这两个集合的交集。虽然你在d上面也建了索引,但是explain的结果告诉你排序的时候并没有用得到d的索引,而是扫描所有的结果集。
因此,我的建议是建立联合索引(b.c.d)。建立联合索引的有一个向左原则,把最常用的那个字段放到最左边