【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
我给一张表添加了create_time时间的ttl,实现自动删除n天以前数据
这个任务执行非常慢,第一次执行需要靠近3个小时,数据量几千万。
我看了sql的执行计划没有走create_time这个字段的索引,这个应该怎么优化
删除几千万数据吗?tidb删除这么多数据本身就不快
辛苦同步下 集群GC、表结构、热力图相关信息
把任务sql完整贴一下,执行计划也贴一下看看吧
会不会是优先级的问题,可以试试直接删的效率如何
low_priority,sql_no_cache
这俩个一加,我感觉从设计上也没指望ttl的运行速度很快。就是挂着慢慢删的。
回到问题本身,怎么让ttl加速,这块我也确实没思路。
方便把执行计划也贴出来吗?
如果数据量大,到设置的任务时间点结束跑不完,怎么办?
弄个 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;
你这是表的统计信息太旧了吧,执行计划肯定走的不对
表很大 手动做一个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;