慢查询

如何通过慢查日志发现有问题的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优化的更多相关文章

  1. mysql优化(三)–explain分析sql语句执行效率

    mysql优化(三)–explain分析sql语句执行效率 mushu 发布于 11个月前 (06-04) 分类:Mysql 阅读(651) 评论(0) Explain命令在解决数据库性能上是第一推荐 ...

  2. [MySQL] 常用SQL的优化--18.4

    这里介绍下,Insert.Group By等SQL语句的优化方法: 1.大批量数据插入 当load命令导入数据的时候,可以进行适当的设置提高导入速度. 1.1 对于MyISAM表,可以先禁用非唯一索引 ...

  3. mysql优化SQL语句的一般步骤及常用方法

    一.优化SQL语句的一般步骤 1. 通过show status命令了解各种SQL的执行频率 mysqladmin extended-status 或: show [session|global]sta ...

  4. MySQL数据库SQL层级优化

    本篇主涉及MySQL SQL Statements层面的优化. 首先,推荐一个链接为万物之始:http://dev.mysql.com/doc/refman/5.0/en/optimization.h ...

  5. mysql优化sql语句的方法

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...

  6. mysql优化之SQL语句优化

    Mysql优化是一个老生常谈的问题, 优化的方向也优化很多:从架构层;从设计层;从存储层;从SQL语句层; 今天讲解一下从SQL语句层: 这个部分是程序员最容易把控的地方,也是最容易忽视的地方. 一个 ...

  7. MYSQL SQL语句优化

    1.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单的示例,标注(1.2.3.4.5)我们要重点关注的数据: type列,连接类型.一个好的SQL语句至少要 ...

  8. mysql优化 | 存储引擎,建表,索引,sql的优化建议

    个人对于选择存储引擎,建表,建索引,sql优化的一些总结,给读者提供一些参考意见 推荐访问我的个人网站,排版更好看: https://chenmingyu.top/mysql-optimize/ 存储 ...

  9. mysql优化:explain分析sql语句执行效率

    Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优 ...

随机推荐

  1. Postgresql ---plv8扩展(windows下安装过程)

    Postgresql下plv8安装过程其实很简单,但是在网络上搜集了半天都没有找到一篇满意的安装文档,现在总结如下: 1.下载和PostgreSQL相对应的plv8版本,下载地址如下: http:// ...

  2. PostgreSQL Json字段作为查询条件案例

    业务扩展字段在数据库中经常会使用json格式的数据来存储,这就涉及到一个头疼的问题,假设要使用扩展字段里的某个值作为查询条件怎么办,原来PostgreSQL本身就支持这种查询方式. 例子:假设业务扩展 ...

  3. 从零开始学 Web 之 HTML(一)认识前端

    大家好,这里是 Daotin 从零开始学 Web 系列教程.此文首发于「 Daotin的梦呓 」,欢迎大家订阅关注.在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识点,期间也会分享 ...

  4. 高可用Hadoop平台-应用JAR部署

    1.概述 今天在观察集群时,发现NN节点的负载过高,虽然对NN节点的资源进行了调整,同时对NN节点上的应用程序进行重新打包调整,负载问题暂时得到缓解.但是,我想了想,这样也不是长久之计.通过这个问题, ...

  5. python3爬虫——下载unsplash美图到本地

    最近发现一个网站www.unsplash.com ( 没有广告费哈,纯粹觉得不错 ),网页做得很美观,上面也都是一些免费的摄影照片,觉得很好看,就决定利用蹩脚的技能写个爬虫下载图片. 先随意感受一下这 ...

  6. 图像融合之泊松融合(Possion Matting)

    前面有介绍拉普拉斯融合,今天说下OpenCV泊松融合使用.顺便提一下,泊松是拉普拉斯的学生. 泊松融合的原理请参考这篇博文https://blog.csdn.net/u011534057/articl ...

  7. .net core 基于IIS发布

    原文链接: https://www.cnblogs.com/gx018/p/7874060.html

  8. Oracle字符串函数

    Oracle字符串函数 平常我们用Oracle主要有两种字符串类型1.char始终为固定的长度,如果设置了长度小于char列的值,则Oracle会自动用空格填充的.当比较char时,Oracle用空格 ...

  9. angularjs学习第八天笔记(指令作用域研究)

    您好,在前两天对指令的简单了解和系统指令学习后 今天主要研究其指针作用域的相关事情 每一个指令在创建时,其实就构成了自己的一个小的模块单元. 其对于的模块单元都有着其对于的作用域,其中作用域一般有两种 ...

  10. C# .aspx 页面更换命名空间

    1.选中命名空间,右键单击,选择重构,之后选择重命名.如下图: 2.弹出重命名对话框 3.重写你需要的名字,点击确定. 4.这里重点注意了,不可直接点击应用,否则你会后悔的.你必须对应的看看那个是否是 ...