Please answer some questions before submitting your issue. Thanks!
2.0.2
无慢SQL
当使用时间长了时候,数据表中的数据比较多,导致慢sql出现,如下的SQL,为数据库端监控到的慢sql,查询所有ID出来,这无疑是一个隐形的雷,使用时间越久,此查询的消耗越恐怖,望解决
q43xntqr1#
呃呃呃呃呃呃1 楼主看下 这个表有多少数据 这个表应该是 xxl_job 保存任务调度执行日志的 一个表,确定这个表的数据 在你们生产环境是否有必要保留,可以 定时任务清理此表 ,个人强烈 推荐 2 查看这个表自身的索引信息 show index from xxl_job_quartz_**log 看下那个字段没有建索引 就那三个筛选条件,但是从mysql 建索引的意义来讲,这种索引意义不大,因为这三个字段重复性太强,任务执行状态 调度结果,告警状态 并不推荐 3 升级版本,我看了你这个版本是19年发布的,这个版本和后续版本最大的不同是作者移除了quartz 这个框架 后续调度的源码是作者手写的 类似于 while(true) trigger 这种,但是你升级版本之后,估计运行一段时间后,依旧会存在慢sql ,作者新版本是 使用了xxl_job_log 表 ,默认了三个索引 id trigger_time 调度时间 hanlde_code执行状态
作者可能也是发现了这个问题,给这三个字段加了组合索引的,但是因为都是重复率很高的字段,还是慢SQLKEY idx_alarmstatus_id_handlecode_triggercode (alarm_status,id,handle_code,trigger_code)应该可以考虑时间维度来过滤掉大部分无用数据,比如查出来所有启用状态下的JOB的执行周期,按最大的周期的2倍作为时间依据,避免全表过滤一遍
我刚用一周 在log百万的时候也没出现慢sql 和你同样的sql 走的I_handle_code索引也就是handle_code好像没毛病 我怀疑是你这个索引建多了 索引合并了 走错索引了 where前面加上 force index(I_handle_code)试试看 应该是有效的
你那个版本应该和楼主的不一样,我这边是 2.2.1 版本,作者xueli是 默认了三个索引 id trigger_time 调度时间 hanlde_code ,或者我觉得这种情况 还建立索引有点违背mysql 建索引的必要性有关,关键还是定时清理不必要日志
可能是我同事建的,我看Github上这个sql是没有组合索引的,确实只有code和time,去掉组合索引之后,速度快了很多,但是还是有0.99s
扫描86w行 说明你们这个job本身写的就有问题 说明存在大量的handle_code不为200(执行结果不是成功)的日志,也就是异常job日志,job肯定大多数都是成功的,加时间维度不是不能考虑,但你肯定首先要检查一下job为什么大量异常吧
嗯,确实有大量的不为200的,我们检查一下代码
iyzzxitl2#
好好检查一下job 正常的业务异常内部处理掉 不要全都向外面抛 外抛的异常代表严重情况需要告警的 这种log量总在小几万还是可以接受的 不至于慢sql 再把你们库里的现有异常log清理掉 以后就不会慢了
z6psavjg3#
pxy2qtax4#
brccelvz5#
他自己建了个索引是(alarm_status,id,handle_code,trigger_code) 只有alarm_status字段生效,甚至可能alarm_status和单列索引handle_code进行了索引合并,所以效果很差,第一步删除这个索引才能看下一步的操作
这不是我建的哈,是原作者建的
cetgtptt6#
刚才看了一个这样的问题 #2416然后想到楼主可以简单操作,配置xxl-job 自带的日志清理 JobLogReportHelper 调度 即可xxl.job.executor.logretentiondays=30默认30天 你可以搞小一点
smdncfj37#
那就看楼主实操一下了,学习学习
7dl7o3gd8#
brtdzjyr9#
ecfdbz9o10#
作者可能也是发现了这个问题,给这三个字段加了组合索引的,但是因为都是重复率很高的字段,还是慢SQLKEY idx_alarmstatus_id_handlecode_triggercode (alarm_status,id,handle_code,trigger_code)
应该可以考虑时间维度来过滤掉大部分无用数据,比如查出来所有启用状态下的JOB的执行周期,按最大的周期的2倍作为时间依据,避免全表过滤一遍
如果非要建组合索引的话 id应该放在最后一位,后续如果有时间过滤 时间放在最后一位
apeeds0o11#
看了下 无论版本这句sql没变过 只是改了个表面 索引也没变过 是楼主自己建了无效组合索引 导致全表扫描
2ul0zpep12#
bjp0bcyl13#
看了执行计划,索引没错的,用的就是作者建的这三个字段的组合索引,可能我们的这个是每个log都已经有很多数据了,总数log已经有480多W了,才会导致这么慢
额 你自己建的这个索引明显是错的 按我上面说的试一下 force index(I_handle_code) 看下速度 索引不是像你这么看的 看key_len=1 说明组合索引只用到了第一个字段 也就是alarm_status 后面字段不生效只起到 索引下推之类的作用
tyky79it14#
mxg2im7a15#
手动加索引?
27条答案
按热度按时间q43xntqr1#
呃呃呃呃呃呃
1 楼主看下 这个表有多少数据 这个表应该是 xxl_job 保存任务调度执行日志的 一个表,确定这个表的数据 在你们生产环境是否有必要保留,可以 定时任务清理此表 ,个人强烈 推荐 2 查看这个表自身的索引信息 show index from xxl_job_quartz_**log 看下那个字段没有建索引 就那三个筛选条件,但是从mysql 建索引的意义来讲,这种索引意义不大,因为这三个字段重复性太强,任务执行状态 调度结果,告警状态 并不推荐 3 升级版本,我看了你这个版本是19年发布的,这个版本和后续版本最大的不同是作者移除了quartz 这个框架 后续调度的源码是作者手写的 类似于 while(true) trigger 这种,但是你升级版本之后,估计运行一段时间后,依旧会存在慢sql ,作者新版本是 使用了xxl_job_log 表 ,默认了三个索引 id trigger_time 调度时间 hanlde_code执行状态
作者可能也是发现了这个问题,给这三个字段加了组合索引的,但是因为都是重复率很高的字段,还是慢SQL
KEY idx_alarmstatus_id_handlecode_triggercode (alarm_status,id,handle_code,trigger_code)
应该可以考虑时间维度来过滤掉大部分无用数据,比如查出来所有启用状态下的JOB的执行周期,按最大的周期的2倍作为时间依据,避免全表过滤一遍
我刚用一周 在log百万的时候也没出现慢sql 和你同样的sql 走的I_handle_code索引也就是handle_code好像没毛病 我怀疑是你这个索引建多了 索引合并了 走错索引了 where前面加上 force index(I_handle_code)试试看 应该是有效的
你那个版本应该和楼主的不一样,我这边是 2.2.1 版本,作者xueli是 默认了三个索引 id trigger_time 调度时间 hanlde_code ,
或者我觉得这种情况 还建立索引有点违背mysql 建索引的必要性有关,关键还是定时清理不必要日志
可能是我同事建的,我看Github上这个sql是没有组合索引的,确实只有code和time,去掉组合索引之后,速度快了很多,但是还是有0.99s
扫描86w行 说明你们这个job本身写的就有问题 说明存在大量的handle_code不为200(执行结果不是成功)的日志,也就是异常job日志,job肯定大多数都是成功的,加时间维度不是不能考虑,但你肯定首先要检查一下job为什么大量异常吧
嗯,确实有大量的不为200的,我们检查一下代码
iyzzxitl2#
呃呃呃呃呃呃
1 楼主看下 这个表有多少数据 这个表应该是 xxl_job 保存任务调度执行日志的 一个表,确定这个表的数据 在你们生产环境是否有必要保留,可以 定时任务清理此表 ,个人强烈 推荐 2 查看这个表自身的索引信息 show index from xxl_job_quartz_**log 看下那个字段没有建索引 就那三个筛选条件,但是从mysql 建索引的意义来讲,这种索引意义不大,因为这三个字段重复性太强,任务执行状态 调度结果,告警状态 并不推荐 3 升级版本,我看了你这个版本是19年发布的,这个版本和后续版本最大的不同是作者移除了quartz 这个框架 后续调度的源码是作者手写的 类似于 while(true) trigger 这种,但是你升级版本之后,估计运行一段时间后,依旧会存在慢sql ,作者新版本是 使用了xxl_job_log 表 ,默认了三个索引 id trigger_time 调度时间 hanlde_code执行状态
作者可能也是发现了这个问题,给这三个字段加了组合索引的,但是因为都是重复率很高的字段,还是慢SQL
KEY idx_alarmstatus_id_handlecode_triggercode (alarm_status,id,handle_code,trigger_code)
应该可以考虑时间维度来过滤掉大部分无用数据,比如查出来所有启用状态下的JOB的执行周期,按最大的周期的2倍作为时间依据,避免全表过滤一遍
我刚用一周 在log百万的时候也没出现慢sql 和你同样的sql 走的I_handle_code索引也就是handle_code好像没毛病 我怀疑是你这个索引建多了 索引合并了 走错索引了 where前面加上 force index(I_handle_code)试试看 应该是有效的
你那个版本应该和楼主的不一样,我这边是 2.2.1 版本,作者xueli是 默认了三个索引 id trigger_time 调度时间 hanlde_code ,
或者我觉得这种情况 还建立索引有点违背mysql 建索引的必要性有关,关键还是定时清理不必要日志
可能是我同事建的,我看Github上这个sql是没有组合索引的,确实只有code和time,去掉组合索引之后,速度快了很多,但是还是有0.99s
好好检查一下job 正常的业务异常内部处理掉 不要全都向外面抛 外抛的异常代表严重情况需要告警的 这种log量总在小几万还是可以接受的 不至于慢sql 再把你们库里的现有异常log清理掉 以后就不会慢了
z6psavjg3#
呃呃呃呃呃呃
1 楼主看下 这个表有多少数据 这个表应该是 xxl_job 保存任务调度执行日志的 一个表,确定这个表的数据 在你们生产环境是否有必要保留,可以 定时任务清理此表 ,个人强烈 推荐 2 查看这个表自身的索引信息 show index from xxl_job_quartz_**log 看下那个字段没有建索引 就那三个筛选条件,但是从mysql 建索引的意义来讲,这种索引意义不大,因为这三个字段重复性太强,任务执行状态 调度结果,告警状态 并不推荐 3 升级版本,我看了你这个版本是19年发布的,这个版本和后续版本最大的不同是作者移除了quartz 这个框架 后续调度的源码是作者手写的 类似于 while(true) trigger 这种,但是你升级版本之后,估计运行一段时间后,依旧会存在慢sql ,作者新版本是 使用了xxl_job_log 表 ,默认了三个索引 id trigger_time 调度时间 hanlde_code执行状态
作者可能也是发现了这个问题,给这三个字段加了组合索引的,但是因为都是重复率很高的字段,还是慢SQL
KEY idx_alarmstatus_id_handlecode_triggercode (alarm_status,id,handle_code,trigger_code)
应该可以考虑时间维度来过滤掉大部分无用数据,比如查出来所有启用状态下的JOB的执行周期,按最大的周期的2倍作为时间依据,避免全表过滤一遍
我刚用一周 在log百万的时候也没出现慢sql 和你同样的sql 走的I_handle_code索引也就是handle_code好像没毛病 我怀疑是你这个索引建多了 索引合并了 走错索引了 where前面加上 force index(I_handle_code)试试看 应该是有效的
你那个版本应该和楼主的不一样,我这边是 2.2.1 版本,作者xueli是 默认了三个索引 id trigger_time 调度时间 hanlde_code ,
或者我觉得这种情况 还建立索引有点违背mysql 建索引的必要性有关,关键还是定时清理不必要日志
可能是我同事建的,我看Github上这个sql是没有组合索引的,确实只有code和time,去掉组合索引之后,速度快了很多,但是还是有0.99s
扫描86w行 说明你们这个job本身写的就有问题 说明存在大量的handle_code不为200(执行结果不是成功)的日志,也就是异常job日志,job肯定大多数都是成功的,加时间维度不是不能考虑,但你肯定首先要检查一下job为什么大量异常吧
pxy2qtax4#
呃呃呃呃呃呃
1 楼主看下 这个表有多少数据 这个表应该是 xxl_job 保存任务调度执行日志的 一个表,确定这个表的数据 在你们生产环境是否有必要保留,可以 定时任务清理此表 ,个人强烈 推荐 2 查看这个表自身的索引信息 show index from xxl_job_quartz_**log 看下那个字段没有建索引 就那三个筛选条件,但是从mysql 建索引的意义来讲,这种索引意义不大,因为这三个字段重复性太强,任务执行状态 调度结果,告警状态 并不推荐 3 升级版本,我看了你这个版本是19年发布的,这个版本和后续版本最大的不同是作者移除了quartz 这个框架 后续调度的源码是作者手写的 类似于 while(true) trigger 这种,但是你升级版本之后,估计运行一段时间后,依旧会存在慢sql ,作者新版本是 使用了xxl_job_log 表 ,默认了三个索引 id trigger_time 调度时间 hanlde_code执行状态
作者可能也是发现了这个问题,给这三个字段加了组合索引的,但是因为都是重复率很高的字段,还是慢SQL
KEY idx_alarmstatus_id_handlecode_triggercode (alarm_status,id,handle_code,trigger_code)
应该可以考虑时间维度来过滤掉大部分无用数据,比如查出来所有启用状态下的JOB的执行周期,按最大的周期的2倍作为时间依据,避免全表过滤一遍
我刚用一周 在log百万的时候也没出现慢sql 和你同样的sql 走的I_handle_code索引也就是handle_code好像没毛病 我怀疑是你这个索引建多了 索引合并了 走错索引了 where前面加上 force index(I_handle_code)试试看 应该是有效的
你那个版本应该和楼主的不一样,我这边是 2.2.1 版本,作者xueli是 默认了三个索引 id trigger_time 调度时间 hanlde_code ,
或者我觉得这种情况 还建立索引有点违背mysql 建索引的必要性有关,关键还是定时清理不必要日志
可能是我同事建的,我看Github上这个sql是没有组合索引的,确实只有code和time,去掉组合索引之后,速度快了很多,但是还是有0.99s
brccelvz5#
呃呃呃呃呃呃
1 楼主看下 这个表有多少数据 这个表应该是 xxl_job 保存任务调度执行日志的 一个表,确定这个表的数据 在你们生产环境是否有必要保留,可以 定时任务清理此表 ,个人强烈 推荐 2 查看这个表自身的索引信息 show index from xxl_job_quartz_**log 看下那个字段没有建索引 就那三个筛选条件,但是从mysql 建索引的意义来讲,这种索引意义不大,因为这三个字段重复性太强,任务执行状态 调度结果,告警状态 并不推荐 3 升级版本,我看了你这个版本是19年发布的,这个版本和后续版本最大的不同是作者移除了quartz 这个框架 后续调度的源码是作者手写的 类似于 while(true) trigger 这种,但是你升级版本之后,估计运行一段时间后,依旧会存在慢sql ,作者新版本是 使用了xxl_job_log 表 ,默认了三个索引 id trigger_time 调度时间 hanlde_code执行状态
作者可能也是发现了这个问题,给这三个字段加了组合索引的,但是因为都是重复率很高的字段,还是慢SQL
KEY idx_alarmstatus_id_handlecode_triggercode (alarm_status,id,handle_code,trigger_code)
应该可以考虑时间维度来过滤掉大部分无用数据,比如查出来所有启用状态下的JOB的执行周期,按最大的周期的2倍作为时间依据,避免全表过滤一遍
我刚用一周 在log百万的时候也没出现慢sql 和你同样的sql 走的I_handle_code索引也就是handle_code好像没毛病 我怀疑是你这个索引建多了 索引合并了 走错索引了 where前面加上 force index(I_handle_code)试试看 应该是有效的
你那个版本应该和楼主的不一样,我这边是 2.2.1 版本,作者xueli是 默认了三个索引 id trigger_time 调度时间 hanlde_code ,
或者我觉得这种情况 还建立索引有点违背mysql 建索引的必要性有关,关键还是定时清理不必要日志
他自己建了个索引是(alarm_status,id,handle_code,trigger_code) 只有alarm_status字段生效,甚至可能alarm_status和单列索引handle_code进行了索引合并,所以效果很差,第一步删除这个索引才能看下一步的操作
这不是我建的哈,是原作者建的
cetgtptt6#
刚才看了一个这样的问题 #2416
然后想到楼主可以简单操作,配置xxl-job 自带的日志清理 JobLogReportHelper 调度 即可
xxl.job.executor.logretentiondays=30
默认30天 你可以搞小一点
smdncfj37#
呃呃呃呃呃呃
1 楼主看下 这个表有多少数据 这个表应该是 xxl_job 保存任务调度执行日志的 一个表,确定这个表的数据 在你们生产环境是否有必要保留,可以 定时任务清理此表 ,个人强烈 推荐 2 查看这个表自身的索引信息 show index from xxl_job_quartz_**log 看下那个字段没有建索引 就那三个筛选条件,但是从mysql 建索引的意义来讲,这种索引意义不大,因为这三个字段重复性太强,任务执行状态 调度结果,告警状态 并不推荐 3 升级版本,我看了你这个版本是19年发布的,这个版本和后续版本最大的不同是作者移除了quartz 这个框架 后续调度的源码是作者手写的 类似于 while(true) trigger 这种,但是你升级版本之后,估计运行一段时间后,依旧会存在慢sql ,作者新版本是 使用了xxl_job_log 表 ,默认了三个索引 id trigger_time 调度时间 hanlde_code执行状态
作者可能也是发现了这个问题,给这三个字段加了组合索引的,但是因为都是重复率很高的字段,还是慢SQL
KEY idx_alarmstatus_id_handlecode_triggercode (alarm_status,id,handle_code,trigger_code)
应该可以考虑时间维度来过滤掉大部分无用数据,比如查出来所有启用状态下的JOB的执行周期,按最大的周期的2倍作为时间依据,避免全表过滤一遍
我刚用一周 在log百万的时候也没出现慢sql 和你同样的sql 走的I_handle_code索引也就是handle_code好像没毛病 我怀疑是你这个索引建多了 索引合并了 走错索引了 where前面加上 force index(I_handle_code)试试看 应该是有效的
你那个版本应该和楼主的不一样,我这边是 2.2.1 版本,作者xueli是 默认了三个索引 id trigger_time 调度时间 hanlde_code ,
或者我觉得这种情况 还建立索引有点违背mysql 建索引的必要性有关,关键还是定时清理不必要日志
他自己建了个索引是(alarm_status,id,handle_code,trigger_code) 只有alarm_status字段生效,甚至可能alarm_status和单列索引handle_code进行了索引合并,所以效果很差,第一步删除这个索引才能看下一步的操作
那就看楼主实操一下了,学习学习
7dl7o3gd8#
呃呃呃呃呃呃
1 楼主看下 这个表有多少数据 这个表应该是 xxl_job 保存任务调度执行日志的 一个表,确定这个表的数据 在你们生产环境是否有必要保留,可以 定时任务清理此表 ,个人强烈 推荐 2 查看这个表自身的索引信息 show index from xxl_job_quartz_**log 看下那个字段没有建索引 就那三个筛选条件,但是从mysql 建索引的意义来讲,这种索引意义不大,因为这三个字段重复性太强,任务执行状态 调度结果,告警状态 并不推荐 3 升级版本,我看了你这个版本是19年发布的,这个版本和后续版本最大的不同是作者移除了quartz 这个框架 后续调度的源码是作者手写的 类似于 while(true) trigger 这种,但是你升级版本之后,估计运行一段时间后,依旧会存在慢sql ,作者新版本是 使用了xxl_job_log 表 ,默认了三个索引 id trigger_time 调度时间 hanlde_code执行状态
作者可能也是发现了这个问题,给这三个字段加了组合索引的,但是因为都是重复率很高的字段,还是慢SQL
KEY idx_alarmstatus_id_handlecode_triggercode (alarm_status,id,handle_code,trigger_code)
应该可以考虑时间维度来过滤掉大部分无用数据,比如查出来所有启用状态下的JOB的执行周期,按最大的周期的2倍作为时间依据,避免全表过滤一遍
我刚用一周 在log百万的时候也没出现慢sql 和你同样的sql 走的I_handle_code索引也就是handle_code好像没毛病 我怀疑是你这个索引建多了 索引合并了 走错索引了 where前面加上 force index(I_handle_code)试试看 应该是有效的
你那个版本应该和楼主的不一样,我这边是 2.2.1 版本,作者xueli是 默认了三个索引 id trigger_time 调度时间 hanlde_code ,
或者我觉得这种情况 还建立索引有点违背mysql 建索引的必要性有关,关键还是定时清理不必要日志
他自己建了个索引是(alarm_status,id,handle_code,trigger_code) 只有alarm_status字段生效,甚至可能alarm_status和单列索引handle_code进行了索引合并,所以效果很差,第一步删除这个索引才能看下一步的操作
brtdzjyr9#
呃呃呃呃呃呃
1 楼主看下 这个表有多少数据 这个表应该是 xxl_job 保存任务调度执行日志的 一个表,确定这个表的数据 在你们生产环境是否有必要保留,可以 定时任务清理此表 ,个人强烈 推荐 2 查看这个表自身的索引信息 show index from xxl_job_quartz_**log 看下那个字段没有建索引 就那三个筛选条件,但是从mysql 建索引的意义来讲,这种索引意义不大,因为这三个字段重复性太强,任务执行状态 调度结果,告警状态 并不推荐 3 升级版本,我看了你这个版本是19年发布的,这个版本和后续版本最大的不同是作者移除了quartz 这个框架 后续调度的源码是作者手写的 类似于 while(true) trigger 这种,但是你升级版本之后,估计运行一段时间后,依旧会存在慢sql ,作者新版本是 使用了xxl_job_log 表 ,默认了三个索引 id trigger_time 调度时间 hanlde_code执行状态
作者可能也是发现了这个问题,给这三个字段加了组合索引的,但是因为都是重复率很高的字段,还是慢SQL
KEY idx_alarmstatus_id_handlecode_triggercode (alarm_status,id,handle_code,trigger_code)
应该可以考虑时间维度来过滤掉大部分无用数据,比如查出来所有启用状态下的JOB的执行周期,按最大的周期的2倍作为时间依据,避免全表过滤一遍
我刚用一周 在log百万的时候也没出现慢sql 和你同样的sql 走的I_handle_code索引也就是handle_code好像没毛病 我怀疑是你这个索引建多了 索引合并了 走错索引了 where前面加上 force index(I_handle_code)试试看 应该是有效的
你那个版本应该和楼主的不一样,我这边是 2.2.1 版本,作者xueli是 默认了三个索引 id trigger_time 调度时间 hanlde_code ,
或者我觉得这种情况 还建立索引有点违背mysql 建索引的必要性有关,关键还是定时清理不必要日志
ecfdbz9o10#
呃呃呃呃呃呃
1 楼主看下 这个表有多少数据 这个表应该是 xxl_job 保存任务调度执行日志的 一个表,确定这个表的数据 在你们生产环境是否有必要保留,可以 定时任务清理此表 ,个人强烈 推荐 2 查看这个表自身的索引信息 show index from xxl_job_quartz_**log 看下那个字段没有建索引 就那三个筛选条件,但是从mysql 建索引的意义来讲,这种索引意义不大,因为这三个字段重复性太强,任务执行状态 调度结果,告警状态 并不推荐 3 升级版本,我看了你这个版本是19年发布的,这个版本和后续版本最大的不同是作者移除了quartz 这个框架 后续调度的源码是作者手写的 类似于 while(true) trigger 这种,但是你升级版本之后,估计运行一段时间后,依旧会存在慢sql ,作者新版本是 使用了xxl_job_log 表 ,默认了三个索引 id trigger_time 调度时间 hanlde_code执行状态
作者可能也是发现了这个问题,给这三个字段加了组合索引的,但是因为都是重复率很高的字段,还是慢SQL
KEY idx_alarmstatus_id_handlecode_triggercode (alarm_status,id,handle_code,trigger_code)
应该可以考虑时间维度来过滤掉大部分无用数据,比如查出来所有启用状态下的JOB的执行周期,按最大的周期的2倍作为时间依据,避免全表过滤一遍
如果非要建组合索引的话 id应该放在最后一位,后续如果有时间过滤 时间放在最后一位
apeeds0o11#
呃呃呃呃呃呃
1 楼主看下 这个表有多少数据 这个表应该是 xxl_job 保存任务调度执行日志的 一个表,确定这个表的数据 在你们生产环境是否有必要保留,可以 定时任务清理此表 ,个人强烈 推荐 2 查看这个表自身的索引信息 show index from xxl_job_quartz_**log 看下那个字段没有建索引 就那三个筛选条件,但是从mysql 建索引的意义来讲,这种索引意义不大,因为这三个字段重复性太强,任务执行状态 调度结果,告警状态 并不推荐 3 升级版本,我看了你这个版本是19年发布的,这个版本和后续版本最大的不同是作者移除了quartz 这个框架 后续调度的源码是作者手写的 类似于 while(true) trigger 这种,但是你升级版本之后,估计运行一段时间后,依旧会存在慢sql ,作者新版本是 使用了xxl_job_log 表 ,默认了三个索引 id trigger_time 调度时间 hanlde_code执行状态
作者可能也是发现了这个问题,给这三个字段加了组合索引的,但是因为都是重复率很高的字段,还是慢SQL
KEY idx_alarmstatus_id_handlecode_triggercode (alarm_status,id,handle_code,trigger_code)
应该可以考虑时间维度来过滤掉大部分无用数据,比如查出来所有启用状态下的JOB的执行周期,按最大的周期的2倍作为时间依据,避免全表过滤一遍
我刚用一周 在log百万的时候也没出现慢sql 和你同样的sql 走的I_handle_code索引也就是handle_code好像没毛病 我怀疑是你这个索引建多了 索引合并了 走错索引了 where前面加上 force index(I_handle_code)试试看 应该是有效的
你那个版本应该和楼主的不一样,我这边是 2.2.1 版本,作者xueli是 默认了三个索引 id trigger_time 调度时间 hanlde_code ,
或者我觉得这种情况 还建立索引有点违背mysql 建索引的必要性有关,关键还是定时清理不必要日志
看了下 无论版本这句sql没变过 只是改了个表面 索引也没变过 是楼主自己建了无效组合索引 导致全表扫描
2ul0zpep12#
呃呃呃呃呃呃
1 楼主看下 这个表有多少数据 这个表应该是 xxl_job 保存任务调度执行日志的 一个表,确定这个表的数据 在你们生产环境是否有必要保留,可以 定时任务清理此表 ,个人强烈 推荐 2 查看这个表自身的索引信息 show index from xxl_job_quartz_**log 看下那个字段没有建索引 就那三个筛选条件,但是从mysql 建索引的意义来讲,这种索引意义不大,因为这三个字段重复性太强,任务执行状态 调度结果,告警状态 并不推荐 3 升级版本,我看了你这个版本是19年发布的,这个版本和后续版本最大的不同是作者移除了quartz 这个框架 后续调度的源码是作者手写的 类似于 while(true) trigger 这种,但是你升级版本之后,估计运行一段时间后,依旧会存在慢sql ,作者新版本是 使用了xxl_job_log 表 ,默认了三个索引 id trigger_time 调度时间 hanlde_code执行状态
作者可能也是发现了这个问题,给这三个字段加了组合索引的,但是因为都是重复率很高的字段,还是慢SQL
KEY idx_alarmstatus_id_handlecode_triggercode (alarm_status,id,handle_code,trigger_code)
应该可以考虑时间维度来过滤掉大部分无用数据,比如查出来所有启用状态下的JOB的执行周期,按最大的周期的2倍作为时间依据,避免全表过滤一遍
我刚用一周 在log百万的时候也没出现慢sql 和你同样的sql 走的I_handle_code索引也就是handle_code好像没毛病 我怀疑是你这个索引建多了 索引合并了 走错索引了 where前面加上 force index(I_handle_code)试试看 应该是有效的
你那个版本应该和楼主的不一样,我这边是 2.2.1 版本,作者xueli是 默认了三个索引 id trigger_time 调度时间 hanlde_code ,
或者我觉得这种情况 还建立索引有点违背mysql 建索引的必要性有关,关键还是定时清理不必要日志
bjp0bcyl13#
呃呃呃呃呃呃
1 楼主看下 这个表有多少数据 这个表应该是 xxl_job 保存任务调度执行日志的 一个表,确定这个表的数据 在你们生产环境是否有必要保留,可以 定时任务清理此表 ,个人强烈 推荐 2 查看这个表自身的索引信息 show index from xxl_job_quartz_**log 看下那个字段没有建索引 就那三个筛选条件,但是从mysql 建索引的意义来讲,这种索引意义不大,因为这三个字段重复性太强,任务执行状态 调度结果,告警状态 并不推荐 3 升级版本,我看了你这个版本是19年发布的,这个版本和后续版本最大的不同是作者移除了quartz 这个框架 后续调度的源码是作者手写的 类似于 while(true) trigger 这种,但是你升级版本之后,估计运行一段时间后,依旧会存在慢sql ,作者新版本是 使用了xxl_job_log 表 ,默认了三个索引 id trigger_time 调度时间 hanlde_code执行状态
作者可能也是发现了这个问题,给这三个字段加了组合索引的,但是因为都是重复率很高的字段,还是慢SQL
KEY idx_alarmstatus_id_handlecode_triggercode (alarm_status,id,handle_code,trigger_code)
应该可以考虑时间维度来过滤掉大部分无用数据,比如查出来所有启用状态下的JOB的执行周期,按最大的周期的2倍作为时间依据,避免全表过滤一遍
我刚用一周 在log百万的时候也没出现慢sql 和你同样的sql 走的I_handle_code索引也就是handle_code好像没毛病 我怀疑是你这个索引建多了 索引合并了 走错索引了 where前面加上 force index(I_handle_code)试试看 应该是有效的
看了执行计划,索引没错的,用的就是作者建的这三个字段的组合索引,可能我们的这个是每个log都已经有很多数据了,总数log已经有480多W了,才会导致这么慢
额 你自己建的这个索引明显是错的 按我上面说的试一下 force index(I_handle_code) 看下速度 索引不是像你这么看的 看key_len=1 说明组合索引只用到了第一个字段 也就是alarm_status 后面字段不生效只起到 索引下推之类的作用
tyky79it14#
呃呃呃呃呃呃
1 楼主看下 这个表有多少数据 这个表应该是 xxl_job 保存任务调度执行日志的 一个表,确定这个表的数据 在你们生产环境是否有必要保留,可以 定时任务清理此表 ,个人强烈 推荐 2 查看这个表自身的索引信息 show index from xxl_job_quartz_**log 看下那个字段没有建索引 就那三个筛选条件,但是从mysql 建索引的意义来讲,这种索引意义不大,因为这三个字段重复性太强,任务执行状态 调度结果,告警状态 并不推荐 3 升级版本,我看了你这个版本是19年发布的,这个版本和后续版本最大的不同是作者移除了quartz 这个框架 后续调度的源码是作者手写的 类似于 while(true) trigger 这种,但是你升级版本之后,估计运行一段时间后,依旧会存在慢sql ,作者新版本是 使用了xxl_job_log 表 ,默认了三个索引 id trigger_time 调度时间 hanlde_code执行状态
作者可能也是发现了这个问题,给这三个字段加了组合索引的,但是因为都是重复率很高的字段,还是慢SQL
KEY idx_alarmstatus_id_handlecode_triggercode (alarm_status,id,handle_code,trigger_code)
应该可以考虑时间维度来过滤掉大部分无用数据,比如查出来所有启用状态下的JOB的执行周期,按最大的周期的2倍作为时间依据,避免全表过滤一遍
我刚用一周 在log百万的时候也没出现慢sql 和你同样的sql 走的I_handle_code索引也就是handle_code好像没毛病 我怀疑是你这个索引建多了 索引合并了 走错索引了 where前面加上 force index(I_handle_code)试试看 应该是有效的
看了执行计划,索引没错的,用的就是作者建的这三个字段的组合索引,可能我们的这个是每个log都已经有很多数据了,总数log已经有480多W了,才会导致这么慢
mxg2im7a15#
手动加索引?