2020-02-27
最近一个日志页面查询很慢,然后去跟踪了查询sql,发现日期字段上即使建了索引,查询还是很慢,执行语句还是使用了全表扫描,于是继续分析下去。
查询语句类似:
select * from logs where createtime >= '2020-01-01' ;
起初因为date上没检索,查询执行的是全表扫描,给条件字段createtime建上索引:
create index idx_createtime on logs(createtime);
再次执行:
expain select id, createtime from logs where createtime >= '2019-01-01' and createtime <= '2020-01-01';
查询执行的还是全表扫描:
网上查询有说是因为在查询数据条数约占总条数五分之一以下时能够使用到索引,但超过五分之一时,使用全表扫描。于是把日期范围缩小:
expain select id, createtime from logs where createtime >= '2020-01-01' and createtime <= '2020-02-01';
果真,查询执行的是range:
由此可知,在进行范围查询时,比如:>、< 、>=、<=等, 如果数据量过大的话,即使where条件字段已经建立了索引,查询语句执行时还是有可能进行全表扫描的。
实际上是不是全表的五分之一以下才会使用索引,这个不能确定,以后再研究了。