数据库 | SQL 诊断优化套路包,套路用的对,速度升百倍
本文出自头条号老王谈运维,转载请说明出处。
前言
在DBA的日常工作中,调整个别性能较差的SQL语句是一项富有挑战性的工作。面对慢SQL,一些DBA会心烦,会沮丧,会束手无措,也会沉着冷静、斗智斗勇!当中的关键在于数据库管理员如何分析得出SQL语句的执行计划和如何从SQL语句的执行计划中发现问题。
下面老王就慢SQL的诊断和优化分享一些常用的套路~
慢SQL诊断
系统层面:
检查系统服务器运行情况,磁盘 I/O 等;
数据库层面:
1、对于MySQL来说,通过慢日志定位慢SQL;
2、对于慢SQL,查看其执行计划,分析耗时的原因;
3、如果缺失索引,根据业务需求,创建合适的索引;如果由于SQL语句的写法有问题,需要根据业务逻辑优化语句的写法。
实用的SQL诊断工具
1、SQLTXPLAIN
是Oracle专家开发的,用于诊断SQL相关的问题的工具,简单易用却功能强大。
对于慢SQL诊断支持很多Optimzer问题:如执行计划异常、SQL慢、结果不正(Wrong Result)等。
慢SQL优化
由 SQL 编写导致的慢 SQL 的优化建议:
1、字段类型转换导致不用索引,如字符串类型的不用引号,数字类型的用引号等,这有可能会用不到索引导致全表扫描;
2、mysql 不支持函数转换,所以字段前面不能加函数,否则这将用不到索引;
3、不要在字段前面加减运算;
4、字符串比较长的可以考虑索引一部份减少索引文件大小,提高写入效率;
5、like % 在前面用不到索引;
6、根据联合索引的第二个及以后的字段单独查询用不到索引;
7、不要使用 select *;
8、排序请尽量使用升序 ;
9、or 的查询尽量用 union 代替 (Innodb);
10、复合索引高选择性的字段排在前面;
11、order by / group by 字段包括在索引当中减少排序,效率会更高。
12、删除表所有记录请用 truncate,不要用 delete
13、不让 mysql 干多余的事情,如:计算
14、在 Innodb上用 select count(*),因为 Innodb 会存储统计信息;
15、慎用 Oder by rand()。
开源 SQL 优化平台
对于 SQL 语句的优化,现在有一些开源的SQL优化平台,这些融入了大量DBA工程师的经验,我们可以借助这些平台对 SQL 进行优化。
1、SOAR
地址:https://github.com/XiaoMi/soar/
是一款 SQL 智能优化与改写工具,由小米运维 DBA 团队出品,SOAR 主要由语法解析器、集成环境、优化建议、重写逻辑、工具集五大模块组成,相比业内其他优秀产品有自己的优势,不仅能帮助你 rewrite SQL并且能给出一些优化的建议。
2、SQLAdvisor
地址:https://github.com/Meituan-Dianping/SQLAdvisor
是由美团点评公司技术工程部DBA团队(北京)开发维护的一个分析SQL给出索引优化建议的工具。它基于MySQL的原生态词法解析,结合分析SQL中的其中条件,聚合条件,多表加入关系给出索引优化建议。
数据库 | SQL 诊断优化套路包,套路用的对,速度升百倍的更多相关文章
- 数据库 SQL语句优化
温馨提示:本篇内容均来自网上,本人只做了稍微处理,未进行细致研究,仅当做以后不备之需,如若你喜欢可尽情转走. 一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图 ...
- MySQL数据库SQL层级优化
本篇主涉及MySQL SQL Statements层面的优化. 首先,推荐一个链接为万物之始:http://dev.mysql.com/doc/refman/5.0/en/optimization.h ...
- 数据库sql常见优化方法
以前刚开始做项目的时候,开发经验尚浅,每次遇到查询比较慢时,项目经理就会问:是不是又用select * 了?查询条件有没有加索引?一语惊醒梦中人,赶紧检查..果然如此! 有时我们写sql语句时,没有考 ...
- MySQL 数据库--SQL语句优化
explain查询和分析sql 开发中,为满足一业务功能,使用mysql书写sql时,一条sql往往有多种写法,那么我们就需要选择执行效率比较高的sql. 因此要比较分析sql的执行过程,且同一条sq ...
- 数据库 | SQL语法优化方法及实例详解
使用复合索引 如果经常执行如上查询,那么建立三个单独索引不如建立一个复合索引,因为三个单独索引通常数据库每次执行只能使用其中一个,虽然这样比不使用索引而进行全表扫描提高了很多效率,但使用复合索引因为索 ...
- 数据库SQL性能优化
1.in与exists的效率比较 in是把外表和内表作hash 连接,而exists 是对外表作loop 循环,每次loop 循环再对内表进行查询.一直以来认为exists 比in 效率高的说法是不准 ...
- 数据库SQL语句优化小结
网上查找的总结: 1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null ...
- 千万级大数据的Mysql数据库SQL语句优化
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- 数据库优化系列——SQL性能优化十条建议
1.查询的模糊匹配 尽量避免在一个复杂查询里面使用 LIKE '%parm1%'—— 红色标识位置的百分号会导致相关列的索引无法使用,最好不要用. 解决办法: 其实只需要对该脚本略做改进,查询速度便 ...
随机推荐
- vue使用sass报Modele build failed: TypeError: this.getResolve is not a function at Object.loader...
项目中使用sass报错,之前一直使用同样的安装方式 cnpm install sass-loader node-sass -D,正常使用没问题,没想到这次同样的方式却报错了,网上查的原因是sass-l ...
- Linux文件的管理
创建:touch vim/vi echo重定向 cat touch 管理: atime mtime touch 文件名 //如果文件不存在,不创建文件 删除:mv /tmp find |x ...
- 解决织梦5.7添加新变量出现:Request var not allow!的办法
找到:根目录->include->common.inc.phpif( strlen($svar)>0 && preg_match('#^(cfg_|GLOBALS|_ ...
- 发送短信——java
闲来无事研究一下调用第三方接口发送短信的技术 这一次我们使用阿里的短信服务 一.进行平台相关服务的注册和设置 下面请参照阿里的短信服务文档进行设置,只要按照文档步骤来差不多30分钟就能搞定服务注册: ...
- SELinux 了解及CentOS7 中 semanage命令的安装
SELinux 安全子系统 SELinux(Security-Enhanced Linux)是美国国家安全局在Linux开源社区的帮助下开发的一个强制访问控制(MAC,Mandatory Access ...
- 3. Dictionaries and Sets
1. Generic Mapping Types The collections.abc module provides the Mapping and MutableMapping ABCs to ...
- hibernate入门配置及第一个hibernate程序
学习了hibernate后就想先给大家分享一下它的配置方法: jar包导入 一.数据库表的创建 二.开启hibernate配置 编译器:eclipse 数据库:mysql 1.创建第一个xml文件 ...
- String 属于基础的数据类型吗?(未完成)
String 属于基础的数据类型吗?(未完成)
- P2057 善意的投票 最小割理解
实现时这样建图:直接将S连向同意的人,T连向不同意的人,若两人是朋友,则在他们之间连一条双向边 #include<bits/stdc++.h> #define il inline usin ...
- 接口自动化平台——httprunnermanager
Windows 环境搭建 1. 下载安装pip install httprunner==1.4.2hrun -V #1.4.2har2case -V #0.1.8 2. httprunnermanag ...