首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何提高该sql的执行效率?

如何提高该sql的执行效率?
EN

Stack Overflow用户
提问于 2020-10-28 18:18:49
回答 1查看 38关注 0票数 0

PRD环境下sql抛出超时异常。

代码语言:javascript
复制
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的索引:

代码语言:javascript
复制
TASK_ID
UPDATE_TIME
CREATE_TIME
RECORD_ID

表lbl_his的联合索引:

代码语言:javascript
复制
TASK_ID, ERROR_CODE, UPDATE_TIME
TASK_ID, CREATE_TIME

没有为表lbl_error_code创建索引。我运行EXPLAIN SELECT,发现sql命中了lbl_his.TASK_ID和lbl_error_code.primary的索引。

如何避免执行超时?

EN

回答 1

Stack Overflow用户

发布于 2020-10-28 18:32:38

对于lbl_his上的索引解决方案,请尝试将非聚集索引放在

  • 首先按精确匹配筛选
  • ,然后按范围(或不精确匹配)筛选

例如,索引的初始部分应该是TASK_ID,然后是CREATE_TIME。把这些放在第一位是非常重要的,因为这意味着引擎可以进行一次搜索来获取数据。

然后包括正在使用的任何其他字段(作为索引的一部分,或者包含-无关紧要)-在本例中为ERROR_CODE。这使您的索引成为覆盖索引。

因此,lbl_his上的最终新非聚集索引应该是(TASK_ID, CREATE_TIME, ERROR_CODE)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64570786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档