升级V4.0.13后SQL变慢了

原来这个SQL执行很快,1秒内执行完成,现在达到300秒。

SELECT count(0) FROM (SELECT a.id, DATE_FORMAT(a.cap_time, ‘%Y-%m-%d %H:%i:%s’) AS capTime, a.camera_name AS cameraName, a.worker_name AS workerName, a.id_card AS idCard, a.cooperator_name AS participating, a.group_name AS groupName, a.profession_name AS professionName, a.alg_type AS algType, s.common_name AS commonName, a.pic_url AS picUrl, a.deal_status AS dealStatus FROM eyeaidb.d_project_alarm_info a, eyeaidb.s_alg_info s WHERE a.alg_type = s.alg_type AND a.project_id = 3428 AND a.company_id = 5 AND (a.cap_time >= DATE_FORMAT(NOW(), ‘%Y-%m-%d’) AND a.cap_time < DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 1 DAY), ‘%Y-%m-%d’)) AND a.alg_type IN (2, 1, 17) AND a.camera_id IN (40, 277, 300, 122, 123, 100)) table_count;

2赞

能否提供一下explain analyze的执行计划?

1赞

1赞

1赞

感觉是统计信息不对,建议执行下 analyze table 在试试

1赞

可以通过这个操作,来查看操作状态

1赞

analyze table eyeaidb.s_alg_info; analyze table eyeaidb.d_project_alarm_info; 执行这两个表吗

1赞

对,相关联的几个表,然后过程可能会很慢,会影响生产上查询和写入的效率

1赞

主要那个IN 特别慢,修改一个很快,但线上很多这样的SQL,修改太多,你们了解一下是不是要修改哪个参数,才让IN也快

1赞

缺 统计信息,会导致 代价模型的计算是错误的,比如没有按照预定的索引做优化等等

最简单的方式,就是先更新统计信息,然后在每个 慢 SQL 一个个看实际的情况,在根据情况来优化…

1赞

analyze table 表名; 执行这个就好了

2赞

统计信息的收集,怎么配置的

主要参数:

系统变量名 默认值 功能
tidb_auto_analyze_ratio 0.5 自动更新阈值
tidb_auto_analyze_start_time 00:00 +0000 一天中能够进行自动更新的开始时间
tidb_auto_analyze_end_time 23:59 +0000 一天中能够进行自动更新的结束时间

参考文档:
https://docs.pingcap.com/zh/tidb/stable/statistics#自动更新

1赞

V4.0.13版本默认是开启的吗

默认是开启的,阈值可以根据需要自己调整

run-auto-analyze

  • TiDB 是否做自动的 Analyze。
  • 默认值:true