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语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优 ...
随机推荐
- (转)你真的会写单例模式吗——Java实现
http://www.runoob.com/design-pattern/singleton-pattern.html 单例模式可能是代码最少的模式了,但是少不一定意味着简单,想要用好.用对单例模式, ...
- 如何更优雅的在kubernetes平台下记录日志
背景 传统项目里面记录日志大多数都是将日志记录到日志文件,升级到分布式架构以后,日志开始由文件转移到elasticsearch(es)中来存储,达到集中管理.在kubernetes平台里面把日志记录到 ...
- log4j学习总结
一直使用log4j来记录日志,但是一直以来没有深入研究过log4j,最近研究了下log4j,下面总结一下: log4j配置: 1. 配置根Logger,其语法为: log4j.rootLogger = ...
- SpringBoot初体验及原理解析
一.前言 上篇文章,我们聊到了SpringBoot得以实现的幕后推手,这次我们来用SpringBoot开始HelloWorld之旅.SpringBoot是Spring框架对“约定大于配置(Conv ...
- Spring Boot + Spring Cloud 构建微服务系统(九):配置中心(Spring Cloud Config)
技术背景 如今微服务架构盛行,在分布式系统中,项目日益庞大,子项目日益增多,每个项目都散落着各种配置文件,且随着服务的增加而不断增多.此时,往往某一个基础服务信息变更,都会导致一系列服务的更新和重启, ...
- Nginx反向代理上传大文件报错(failed to load resource : net :: ERR_CONNECTION_RESET)
转自: https://blog.csdn.net/kinginblue/article/details/50753271?locationNum=14&fps=1 Nginx反向代理上传大文 ...
- Python vtk学习(1)
Vtk,(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的,包含有 ...
- Django之模型层(多表操作)
一.创建模型 1,一对多关系 一本书只有一个出版社,一个出版社可以出版多本书,从而书与出版社之间就构成一对多关系,书是‘多’的一方,出版社是‘一’的一方,我们在建立模型的时候,把外键写在‘多’的一方, ...
- asp.net前台页面与后台之间传值,
在前台用 js 获取到的 “值 ”需要传到后台,在后台调用, ****** 原有传入的 “值 ” 不要被覆盖 1.最简单的在页面写一个隐藏表单,隐藏标签,把获取到的值赋给隐藏标签之后 ...
- [PHP] 算法-请找出带环链表的环的入口结点的PHP实现
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null 1.找链表倒数第k个结点,输入一个链表,输出该链表中倒数第k个结点.第一个指针走(k-1)步,到达第k个节点,两个指针同时往后 ...