="或"<="范围查询时不走索引">="或"<="范围查询时不走索引" />
美文网首页
MySQL使用">="或"<="范围查询时不走索引

MySQL使用">="或"<="范围查询时不走索引

作者: 天冷请穿衣 | 来源:发表于2020-02-27 18:25 被阅读0次

    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条件字段已经建立了索引,查询语句执行时还是有可能进行全表扫描的。
    实际上是不是全表的五分之一以下才会使用索引,这个不能确定,以后再研究了。

    相关文章

      网友评论

          本文标题:MySQL使用">="或"<="范围查询时不走索引

          本文链接:https://www.haomeiwen.com/subject/mpexhhtx.html