SQL mysql优化
慢查询
如何通过慢查日志发现有问题的SQL?
- 查询次数多且每次查询占用时间长的SQL
- pt-query-digest分析前几个查询
- IO大的SQL
- pt-query-diges分析中的Rows examine项
- 未命中索引的SQL
- pt-query-digest分析中Rows examine 和Rows Send的对比
如何分析SQL查询
- 使用explain查询SQL的执行计划
explain select custome_id,first_name,last_name from customers; - explain返回列的含义
table:显示这一行的数据是哪张表的
type: 这是重要的列,显示连接用了何种类型,从最好到最差的类型为
const,eq_reg、ref、range、index、ALL
possible_keys: 显示可能应用在这张表中的索引,如果未空,没有可能的索引。
key:实际使用的索引。如果为NULL,则没有使用索引。
key_len:使用的索引长度。在不损失精确性的情况下,长度越短越好
ref:显示索引被哪一列使用了,如果可能的话是一个常数
rows:MYSQL认为必须检查的用来返回请求数据的行数。 - 需要注意的返回列
- Using filesort:看到这个的时候,查询就需要优化了,MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行。
- Using temporary 看到这个的时候就需要优化了。这里,MSQL需要创建一个临时表来存储结果,这通常发生在对不同的列进行Order By上,而不是Group By上。
max()和Count()的优化
查询最后支付的时间-优化max()函数
select max(payment_date) from payment
explain select max(payment_date) from payment
建索引:
create index idx_paydate on payment(pay_date);
在一条SQL中同事查出2006年和2007年的电影的数量--优化count()函数
错误的方式
select count(release_year='2006' or release_year='2006') from film;
分开计算2006和2007年的电影数量
select count(*) from film where release_year='2006' AND
release_year='2007';
优化:
select count(release_year='2006' or NULL)
select count(release_year='2076' or NULL)
备注:count(*)包含空值,count(某一列) 不包含某一列
子查询优化:
通常情况下,需要把子查询优化为join查询,但在优化时需要注意关联键是否有一对多的关系。需要注意数据重复
groupby优化:
通过关联子查询优化
limit查询的优化:
limit常用于分页处理,时常会伴随order by 从句使用,因此大多时候会使用Filesorts这样会造成大量的IO。
记录上次返回的主键,在下次查询时使用主键过滤。
索引优化
pt-duplicate-key-checker \
-h 127.0.0.1 \
-uroot \
-p root \
--databases hand_sql \
--tables HAND_COURSE
索引使用情况分析
pt-index-usage \
-u root \
-p root \
mysql-slow.log
pt-query-digest --report /tmp/mysql-slow.log
SQL mysql优化的更多相关文章
- mysql优化(三)–explain分析sql语句执行效率
mysql优化(三)–explain分析sql语句执行效率 mushu 发布于 11个月前 (06-04) 分类:Mysql 阅读(651) 评论(0) Explain命令在解决数据库性能上是第一推荐 ...
- [MySQL] 常用SQL的优化--18.4
这里介绍下,Insert.Group By等SQL语句的优化方法: 1.大批量数据插入 当load命令导入数据的时候,可以进行适当的设置提高导入速度. 1.1 对于MyISAM表,可以先禁用非唯一索引 ...
- mysql优化SQL语句的一般步骤及常用方法
一.优化SQL语句的一般步骤 1. 通过show status命令了解各种SQL的执行频率 mysqladmin extended-status 或: show [session|global]sta ...
- MySQL数据库SQL层级优化
本篇主涉及MySQL SQL Statements层面的优化. 首先,推荐一个链接为万物之始:http://dev.mysql.com/doc/refman/5.0/en/optimization.h ...
- mysql优化sql语句的方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...
- mysql优化之SQL语句优化
Mysql优化是一个老生常谈的问题, 优化的方向也优化很多:从架构层;从设计层;从存储层;从SQL语句层; 今天讲解一下从SQL语句层: 这个部分是程序员最容易把控的地方,也是最容易忽视的地方. 一个 ...
- MYSQL SQL语句优化
1.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单的示例,标注(1.2.3.4.5)我们要重点关注的数据: type列,连接类型.一个好的SQL语句至少要 ...
- mysql优化 | 存储引擎,建表,索引,sql的优化建议
个人对于选择存储引擎,建表,建索引,sql优化的一些总结,给读者提供一些参考意见 推荐访问我的个人网站,排版更好看: https://chenmingyu.top/mysql-optimize/ 存储 ...
- mysql优化:explain分析sql语句执行效率
Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优 ...
随机推荐
- Eclipse 工程目录下的.classpath、.project文件和.settings文件作用
1..classpath 定义了你这个项目在编译时所使用的$CLASSPATH (注: 每次在更新jar的版本或者增加jar之后,请在SVN提交.classpath文件,否则工程的build path ...
- Feign快速入门
一.Feign简介1.Feign是一个声明式的web服务客户端,使用Feign编写web服务客户端更加容易2.具有可插拔注解支持,包括Feign注解和JAX-RS注解,还支持可插拔的编码器与解码器3. ...
- API 接口返回值
API 接口返回值 https://blog.csdn.net/baple/article/details/52925772
- InnoDB存储引擎概览
InnoDB存储引擎概览 InnoDB存储引擎以其平衡了高可靠性和高性能性而闻名遐迩,在MySQL 8.0版本中,InnoDB存储引擎是默认的存储引擎.(历史追溯从MySQL 5.5.5版本开始, ...
- XCode - App installation failed (A valid provisioning profile for this executable was not found)
OSX:10.14 XCode:10.1 iPhone:iPhone 4S IOS9.3.5 我不得不骂那些SB们,不懂就别TMD乱写文章,误导别人!!我今天看了很多关于这个错误的中文文章,结果都没能 ...
- [javaEE] Servlet的手动配置
一.Servlet sun提供的一种动态web资源开发技术,本质上就是一段java小程序,可以将Sevlet加入到Servlet容器中 *Servlet容器 -- 能够运行Servlet的环境就叫做S ...
- [Linux] Linux Shell查找文件
#!/bin/bash # 查找当前目录中所有大于1mb的文件,把文件名写到文本文件中,统计个数 # # find命令,参数:路径地址,命令参数,-size n (查找长度为n的文件) -type f ...
- Spring源码分析之IoC容器初始化
本文首发于cdream个人博客(点击获得更加阅读体验) 欢迎转载,转载请注明出处 作为一个java程序员,保守估计一年里也都有300天要和Spring有亲密接触~~像我这种怕是每天都要撸撸Spring ...
- SSM(Spring+SpringMvc+Mybatis)整合笔记
1.使用开发工具 jdk1.8 eclipse Tomcat7.0 MySql 2.创建数据库和表,由于重点是整合,所以数据库就随意加几条数据. 3.创建动态Web项目(推荐使用Maven可以用配置来 ...
- APP接口做什么?
提交数据:GET POST 有的接口是获取数据和提交数据相结合形式:如检测更新下载