有一个查询语句效率很低,但是实在无法确定该怎么建立索引。
查询条件是
select
xxx
from
a=1
and b !=1
and c = 1
and d = 1
order by
e desc
limit
0,2
其中
1. a和d是表示状态的字段,重复度很高不适合建索引的那种
2. c的重复度很低,相同的只有几条,但有一大半是空值
3. b是主键 但取的是!=也走不了索引
4. e是数据的入库时间
在不改变查询条件的情况下应该把索引建在哪里?索引的字段顺序应该怎么放?
首先b字段是会走索引的,可以看下mysql的最左原则及mysql索引失效的几种规则。不是重复度高,不能建索引,若数据量大的话还是可以建索引的,索引用的是B-tree树,相当于折半查找。建议建索引a,d,c。另外使用explain查看一下执行计划。
排序为什么要用e呢?
首先考虑如果c=1这儿的1是具体数值不是空的话,就建c上先看下,这样会走索引扫描INDEX RANGE SCAN,效率也比较高,如果说会等于空值那么你的结果集必定很大除非你b!=的筛选很多,那这样瓶颈就不是建索引解决的了