进行分组查询速度太慢

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:5.7.25-TiDB-v3.0.5
  • 【前置条件】:数据量4kw
  • 【问题描述】:进行分组查询速度超过1s
  • 【表结构】: CREATE TABLE sy_ads_bond_risk_detail ( uniqueId varchar(100) NOT NULL COMMENT ‘id’, createDate date DEFAULT NULL, bondId int(11) DEFAULT NULL COMMENT ‘id’, secuCode varchar(10) DEFAULT NULL, sname varchar(100) DEFAULT NULL, cname varchar(200) DEFAULT NULL, issuer varchar(200) DEFAULT NULL, secuMarket int(11) DEFAULT NULL, underwriter varchar(200) DEFAULT NULL, startDate datetime DEFAULT NULL, endDate datetime DEFAULT NULL, subjectType varchar(50) DEFAULT NULL, websiteSnapshot varchar(1000) DEFAULT NULL COMMENT ‘url’, eventId varchar(100) NOT NULL, eventType varchar(50) DEFAULT NULL, eventSubject varchar(100) DEFAULT NULL, eventNum1 varchar(100) DEFAULT NULL COMMENT ‘1’, eventNum2 varchar(100) DEFAULT NULL COMMENT ‘2’, eventNum3 varchar(100) DEFAULT NULL COMMENT ‘3’, party1 varchar(1000) DEFAULT NULL COMMENT ‘1’, party2 varchar(1000) DEFAULT NULL COMMENT ‘2’, party3 varchar(1000) DEFAULT NULL COMMENT ‘3’, cash1 decimal(19,4) DEFAULT NULL COMMENT ‘1’, cash2 decimal(19,4) DEFAULT NULL COMMENT ‘2’, cash3 decimal(19,4) DEFAULT NULL COMMENT ‘3’, label1 varchar(100) DEFAULT NULL COMMENT ‘1’, label2 varchar(100) DEFAULT NULL COMMENT ‘2’, label3 varchar(100) DEFAULT NULL COMMENT ‘3’, priority varchar(50) DEFAULT NULL, eventDesc text DEFAULT NULL, detail text DEFAULT NULL, eventSrc varchar(100) DEFAULT NULL, eventUrl varchar(1000) DEFAULT NULL, eventTime datetime DEFAULT NULL, endTime datetime DEFAULT NULL, pubTime datetime DEFAULT NULL, subTime datetime DEFAULT NULL, isValid tinyint(4) DEFAULT NULL COMMENT ’ 0- 1-’, modifyTime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, relationLink text DEFAULT NULL, secuMarket2 varchar(50) NOT NULL COMMENT ‘-zxjt’, PRIMARY KEY (uniqueId), KEY isValid_index (isValid), KEY eventType_index (eventType), KEY eventSubject_index (eventSubject), KEY bondId_index (bondId), KEY createDate_index (createDate), KEY startDate_index (startDate), KEY sub_endDate_underwrite_index (subTime,endDate,underwriter) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
  • 【查询语句】: SELECT * FROM sy_ads_bond_risk_detail a WHERE a.subTime BETWEEN ‘2019-11-10 00:00:00’ AND ‘2019-12-13 00:00:00’ AND a.endDate <‘2019-12-13 00:00:00’ AND underwriter = ‘中信建投证券股份有限公司’ AND a.isValid = 1 GROUP BY a.eventId,a.ISSUER LIMIT 0,20; 执行计划:

具体时间是多久?目前对分页查询稍微慢一些符合预期。

26s+

这是慢查询日志

收到 我们看下,另外这个语句并发高吗?

没有并发,整个库现在只有自己在用

  1. 在业务低峰期执行更新统计信息 analyze table sy_ads_bond_risk_detail
  2. SHOW STATS_HISTOGRAMS where table_name like 'sy_ads_bond_risk_detail' 麻烦给下结果。

从截图的慢查询日志看,sy_ads_bond_risk_detail 表没有用到索引(缺少 index 相关字段),Total_keys 扫描了 4kw+ 的 keys,走了全表扫描;

从截图的执行计划看,走了 sub_endDate_underwrite_index 索引然后回表扫描;

建议收集完统计信息后,再执行 explain analyze 看下执行计划和实际时间。

统计信息怎么收集?

建议看下上面的历史信息,给出了收集统计信息的示例语句:

  1. 在业务低峰期执行更新统计信息 analyze table sy_ads_bond_risk_detail

  2. SHOW STATS_HISTOGRAMS where table_name like 'sy_ads_bond_risk_detail' 麻烦给下结果。

  1. 收集的信息

2.收集完信息后的执行计划

1、可以提供下收集统计信息后的完整的执行计划

2、收集后,执行效率是否有变化?

这就是收集完统计信息后的执行计划

请问收集完统计信息之后,执行时间有提升吗?