PRD环境下sql抛出超时异常。
SELECT
COUNT(*) totalCount,
SUM(IF(t.RESULT_FLAG = 'success', 1, 0)) successCount,
SUM(IF(b.ERROR_CODE = 'Y140', 1, 0)) unrecognizedCount,
SUM(IF(b.ERROR_CODE LIKE 'Y%' OR b.ERROR_CODE = 'E008', 1, 0)) connectCall,
SUM(IF(b.ERROR_CODE = 'N004', 1, 0)) hangupUnconnect,
SUM(IF(b.ERROR_CODE = 'Y001', 1, 0)) hangupConnect
FROM
lbl_his b LEFT JOIN lbl_error_code t ON b.TASK_ID = t.TASK_ID AND t.CODE = b.ERROR_CODE
WHERE
b.TASK_ID = "5f460e4ffa99f51697ad4ae3"
AND b.CREATE_TIME BETWEEN "2020-07-01 00:00:00" AND "2020-10-28 00:00:00"表lbl_his的大小超大。大约2000万行数据占用了20的磁盘。
表lbl_error_code的大小很小。只有305行。
表lbl_his的索引:
TASK_ID
UPDATE_TIME
CREATE_TIME
RECORD_ID表lbl_his的联合索引:
TASK_ID, ERROR_CODE, UPDATE_TIME
TASK_ID, CREATE_TIME没有为表lbl_error_code创建索引。我运行EXPLAIN SELECT,发现sql命中了lbl_his.TASK_ID和lbl_error_code.primary的索引。
如何避免执行超时?
发布于 2020-10-28 18:32:38
对于lbl_his上的索引解决方案,请尝试将非聚集索引放在
例如,索引的初始部分应该是TASK_ID,然后是CREATE_TIME。把这些放在第一位是非常重要的,因为这意味着引擎可以进行一次搜索来获取数据。
然后包括正在使用的任何其他字段(作为索引的一部分,或者包含-无关紧要)-在本例中为ERROR_CODE。这使您的索引成为覆盖索引。
因此,lbl_his上的最终新非聚集索引应该是(TASK_ID, CREATE_TIME, ERROR_CODE)
https://stackoverflow.com/questions/64570786
复制相似问题