ttl定时删除数据非常慢,执行计划看没有走索引

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
我给一张表添加了create_time时间的ttl,实现自动删除n天以前数据
这个任务执行非常慢,第一次执行需要靠近3个小时,数据量几千万。
我看了sql的执行计划没有走create_time这个字段的索引,这个应该怎么优化


删除几千万数据吗?tidb删除这么多数据本身就不快

1 个赞

辛苦同步下 集群GC、表结构、热力图相关信息

1 个赞

把任务sql完整贴一下,执行计划也贴一下看看吧

1 个赞

会不会是优先级的问题,可以试试直接删的效率如何

low_priority,sql_no_cache

这俩个一加,我感觉从设计上也没指望ttl的运行速度很快。就是挂着慢慢删的。

回到问题本身,怎么让ttl加速,这块我也确实没思路。

方便把执行计划也贴出来吗?

截图里是sql和执行计划,这种分段的sql要跑37分钟。是不是太慢了,一晚上也删不了多少数据。

如果数据量大,到设置的任务时间点结束跑不完,怎么办?

弄个 binding 搞一下喽

带LOW_PRIORITY SQL_NO_CACHE 支持CREATE GLOBAL BINDING?我试了下不行
去掉后
CREATE GLOBAL BINDING FOR SELECT
id
FROM
soa_vehicle.t_track_ride_detail
WHERE
id >= ?
AND id < ?
AND create_time < FROM_UNIXTIME(?) ORDER BY id ASC LIMIT 500
USING
SELECT /+ use_index(soa_vehicle.t_track_ride_detail, feng)/ id FROM soa_vehicle.t_track_ride_detail WHERE id >= ?
AND id < ?
AND create_time < FROM_UNIXTIME(?)
ORDER BY
id ASC
LIMIT 500; 创建是成功了
但是匹配不了 select LOW_PRIORITY SQL_NO_CACHE id FROM soa_vehicle.t_track_ride_detail WHERE id >= 69546507906 AND id < 159985579717 AND create_time < FROM_UNIXTIME(1627146194) ORDER BY id ASC LIMIT 500;

你这是表的统计信息太旧了吧,执行计划肯定走的不对

1 个赞

表很大 手动做一个analyze要很久很久,想要删掉点数据再做

确实是很久不做表信息统计了,另一张同样问题的数据量少的表analyze下就好了

做了个执行计划绑定,又能走索引了
CREATE global BINDING FOR SELECT LOW_PRIORITY SQL_NO_CACHE
id
FROM
soa_vehicle.t_track_ride_detail
WHERE
id >= ?
AND id < ?
AND create_time < FROM_UNIXTIME( ? ) ORDER BY id ASC LIMIT 500
USING
SELECT
LOW_PRIORITY SQL_NO_CACHE id
FROM soa_vehicle.t_track_ride_detail use index(feng)
WHERE id >= ? AND id < ?
AND create_time < FROM_UNIXTIME(?)
ORDER BY id ASC LIMIT 500;