记一次sql慢查询

来源:互联网 发布:游戏编程教学 编辑:程序博客网 时间:2024/06/06 02:58

项目中需要记录一个时间序列键值数据,同时需要查找最近的一次记录,所以有如下sql:
SELECT MAX(ts) AS ts FROM lpd_stat WHERE metric = ‘load’ AND ts like ‘2017-07-02 10%’
metric为键,ts为时间点,类型为DATETIME,上述sql用来找出键为“load”的最近的时间。
lpd_stat中有2千多万条记录,建立了(metric, ts)的组合索引,explain时发现此sql使用了索引,但是查询时间为10几秒,所以怀疑ts并没有使用索引,改为如下查询:
SELECT MAX(ts) AS ts FROM lpd_stat WHERE metric = ‘load’ AND ts>=’2017-07-02 10:00:00’
运行后发现只需70几毫秒,所以可以证明确实没有走索引,为什么呢?
经过各种查询,得知mysql中DATETIME的存储格式并非字符串,而是8字节的数字,具体见 https://dev.mysql.com/doc/internals/en/date-and-time-data-type-representation.html
所以千万记住时间like是不会走索引的!