背景
数据量900W , 数据体量 800MB,复合索引 Index:(`action_name`, `status`)
慢SQL
SELECT
*
FROM
i_timetask
WHERE
STATUS IN ( 0, 100 )
AND action_name = 'XXX'
AND env = 'gray'
AND ( now( ) - gmt_create > 5 )
LIMIT 1000;
用到了符合索引 “action_name”,"status" 耗时为6-7s
慢SQL原因
env 字段并没有包含到符合索引当中,假设符合条件
STATUS IN ( 0, 100 )
AND action_name = 'XXX'
的数据集结果为100W,但同时符合 env=‘gray’的条件在第99.9W的时候,由于数据量过大会将查询出来的结果存储到文件当中,进行筛选 env=‘gray’的数据,然后再返回给客户端。
showprofile的数据如下
可以看见发生了大量的上下文切换和块设备的读写(可以理解为系统调用)
解决方案
修改后的符合索引结构为 `action_name`, `status`, `env`
查询时间从6-7S降低到了 0.034S