慢sql治理经典案例分享
一 全表扫描
1 案例
SELECTcount(*) AS tmp_count FROM (
SELECT * FROM`XXX_rules`WHERE1 = 1ORDERBY gmt_create DESC ) a
2 溯源
3 分析
4 解决方案
SELECTcount(*) AS tmp_count FROM (
SELECT * FROM`xxx_rules`WHERE1 = 1AND`rule_value` = '2928597xxx' ) a
5 思考
二 索引混乱
1 示例
2 分析
1、rule_name离散度不高,放在索引首位不合适;
2、前三个索引重合度很高;
1、独立的列:索引列不能是表达式的一部分;
2、选择区分度高的列作为索引;
3、选择合适的索引列顺序:将选择性高的索引列放在最前列;
4、覆盖索引:查询的列均在索引中,不需要回查聚簇索引;
5、使用索引扫描来做排序;
6、在遵守最左前缀的原则下,尽量扩展索引,而不是创建索引。
3 治理
三 非必要排序
1 问题描述
2 解决方案
四 粗粒度查询
1 问题描述
SELECT * FROM XXX_rules
WHERE rule_name = 'apf_distributors'
ANDstatus = '00'
AND product_code = 'ADVANCE'
2 分析
3 解决方案
五 OR导致索引失效
1 案例
SELECTcount(*)
FROM XXX_level_report
WHERE1 = 1
ANDEXISTS (
SELECT1
FROM XXX_white_list t
WHERE (t.biz_id = customer_id
OR customer_id LIKECONCAT(t.biz_id, '@%'))
AND t.status = 1
AND (t.start_time <= CURRENT_TIME
OR t.start_time ISNULL)
AND (t.end_time >= CURRENT_TIME
OR t.end_time ISNULL)
AND t.biz_type = 'GOODS_CONTROL_BLACKLIST'
)
2 分析
1、OR查询左右有未命中索引的;
2、复合索引不满足最左匹配原则;
3、Like以%开头;
4、需要类型转换;
5、where中索引列有运算;
6、where中索引列使用了函数;
7、如果mysql觉得全表扫描更快时(数据少时)
3 解决方案
业务全链路追踪最佳实践
点击阅读原文查看详情
阅读原文 最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。