惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
WordPress大学
WordPress大学
阮一峰的网络日志
阮一峰的网络日志
博客园 - 司徒正美
月光博客
月光博客
宝玉的分享
宝玉的分享
Recent Announcements
Recent Announcements
小众软件
小众软件
H
Hackread – Cybersecurity News, Data Breaches, AI and More
美团技术团队
博客园 - 三生石上(FineUI控件)
A
About on SuperTechFans
J
Java Code Geeks
云风的 BLOG
云风的 BLOG
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
IT之家
IT之家
Vercel News
Vercel News
量子位
Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
腾讯CDC
有赞技术团队
有赞技术团队

博客园 - 我的bug

项目引入同一jar包不同版本处理 【笔记】redis实现类 【笔记】websockt一对一聊天java部分 【笔记】vue中websocket心跳机制 【笔记】MySQL删除重复记录保留一条 oss上传实例 jquery实现图片点击旋转 IDEA卡顿解决方法 斐波那契数列 【笔记】接口发送数据及接收 【笔记】获取新浪财经最新的USDT-CNY的汇率 【笔记】Java 信任所有SSL证书(解决PKIX path building failed问题) 【笔记】jquery判断两个日期之间相差多少天 【笔记】spring定时器时间配置实例 【笔记】jquery加减乘除及科学计算法处理 string 日期相加和相减 java小算法复习 找出一组数字中出现最多的字符 【转载】js清空cookie
sql查询慢原因及优化
我的bug · 2017-07-04 · via 博客园 - 我的bug

1 导致慢 SQL 的原因

在遇到慢 SQL 情况时,不能简单的把原因归结为 SQL 编写问题(虽然这是最常见的因素),实际上导致慢 SQL 有很多因素,甚至包括硬件和 mysql 本身的 bug。根据出现的概率从大到小,罗列如下:

    1. SQL编写问题
    2. 业务实例相互干绕对 IO/CPU 资源争用
    3. 服务器硬件
    4. MYSQL BUG

2 由 SQL 编写导致的慢 SQL 优化

针对SQL编写导致的慢 SQL,优化起来还是相对比较方便的。正如上一节提到的正确的使用索引能加快查询速度,那么我们在编写 SQL 时就需要注意与索引相关的规则:

    1. 字段类型转换导致不用索引,如字符串类型的不用引号,数字类型的用引号等,这有可能会用不到索引导致全表扫描;
    2. mysql 不支持函数转换,所以字段前面不能加函数,否则这将用不到索引;
    3. 不要在字段前面加减运算;
    4. 字符串比较长的可以考虑索引一部份减少索引文件大小,提高写入效率;
    5. like % 在前面用不到索引;
    6. 根据联合索引的第二个及以后的字段单独查询用不到索引;
    7. 不要使用 select *;
    8. 排序请尽量使用升序 ;
    9. or 的查询尽量用 union 代替 (Innodb);
    10. 复合索引高选择性的字段排在前面;
    11. order by / group by 字段包括在索引当中减少排序,效率会更高。

除了上述索引使用规则外,SQL 编写时还需要特别注意一下几点:

    1. 尽量规避大事务的 SQL,大事务的 SQL 会影响数据库的并发性能及主从同步;
    2. 分页语句 limit 的问题;
    3. 删除表所有记录请用 truncate,不要用 delete;
    4. 不让 mysql 干多余的事情,如计算;
    5. 输写 SQL 带字段,以防止后面表变更带来的问题,性能也是比较优的 ( 涉及到数据字典解析,请自行查询资料);
    6. 在 Innodb上用 select count(*),因为 Innodb 会存储统计信息;
    7. 慎用 Oder by rand()。