在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
背景在一个表中,dataTime字段设置是varchar类型,存入的数据是日期格式的数据,并且为该字段设置了索引。但是在日志记录中,有一条关于该表的慢查询。查询语句为: 探索一:起初,认为是dataTime字段类型为varchar,所以mysql在索引排序时,按照字符串顺序进行排序了,而不是日期大小顺序进行排序的,所以在范围查询时,并不能按照日期顺序进行索引的范围分区。于是把dataTime改为datatime类型,在分析语句,发现还是全表扫描。 二:改变查询条件的值, select count(*) from digitaltwin_meteorological where dataTime > '2021-10-15'; 执行结果为3910。 EXPLAIN select * from digitaltwin_meteorological where dataTime > '2021-10-15'; sql语句分析结果为全表扫描:
我们把查询条件改为16号,看有多少条数据: select count(*) from digitaltwin_meteorological where dataTime > '2021-10-16'; 查询结果为2525,下面我们分析16号的查询语句: EXPLAIN select * from digitaltwin_meteorological where dataTime > '2021-10-16'; 执行结果为range查询,利用到了索引: 由此可见,当查询出来的记录条数多时,mysql会走全表扫描,认为全表扫描的效率更快。当查询出来的记录少时,mysql会使用索引查询。 三:我们把dataTime该为了datetime数据类型,那么查询条件是否还需要加引号呢,我们把dataTime查询条件的引号去掉,看结果: EXPLAIN select * from digitaltwin_meteorological where dataTime > 2021-10-16;
select count(*) from digitaltwin_meteorological where dataTime > 2021-10-16; 计算结果为19714,全表的数据,所以说,datetime查询条件也需要加引号。 四:如上的分析,都是dataTime在datetime类型情况下的讨论。而最初的字段类型是varchar,那么改成varchar类型,如上的结论还存在吗,我们修改类型,再执行sql: EXPLAIN select * from digitaltwin_meteorological where dataTime > '2021-10-16';
可以看到,改成varchar类型后,16号查询成了全表扫描,而不是range扫描。 EXPLAIN select * from digitaltwin_meteorological where dataTime > '2021-10-17';
17号的查询走了索引查询。我们看17号的数据量是1749。 总结通过上述分析,可以总结如下结论: 到此这篇关于记一次Mysql不走日期字段索引的原因的文章就介绍到这了,更多相关Mysql 日期字段索引内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论