在工作中遇到记录日志的表查询慢问题,定位到该sql语句后发现是一个非常简单的select查询:
SELECT
t.id,
t.job_group,
t.job_id,
t.executor_address,
t.executor_handler,
t.executor_param,
t.executor_sharding_param,
t.executor_fail_retry_count,
t.trigger_time,
t.trigger_code,
t.trigger_msg,
t.handle_time,
t.handle_code,
t.handle_msg,
t.alarm_status
FROM
xxl_job_log AS t
WHERE
t.trigger_time >= '2020-01-01 00:00:00.0'
AND
t.trigger_time <= '2020-01-01 23:59:59.0'
AND
alarm_status = 0
ORDER BY
t.trigger_time DESC
LIMIT 0,
10
查询目前表数据条数:八百多万条数据
通过使用explain 定位看到:
查询类型:全表扫描
扫描条数:7889316
执行sql耗时:9.563s
经过对sql的定位发现,只要加上trigger_time时间过滤查询,查询速度就会变的非常慢,当去掉
t.trigger_time >= '2020-01-01 00:00:00.0'
AND
t.trigger_time <= '2020-01-01 23:59:59.0'
和
ORDER BY
t.trigger_time DESC
后在执行sql:0.002s
因此知道时间都花在了时间过滤的动作上,于是对trigger_time做了索引操作:
ALTER TABLE xxl_job_log ADD INDEX index_job_time (trigger_time)
在使用explain查看select执行情况:
扫描范围:局部
扫描条数:694454
执行sql耗时:0.002s