慢查询

如何通过慢查日志发现有问题的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. Dapper内部分享ppt

    http://www.knowsky.com/887446.htmlhttp://www.tritac.com/bp-24-dapper-net-by-examplehttp://www.cnblog ...

  2. Appium定位方式总结

    通过appium-desktop定位元素 ClassName Android Android的class属性对应ClassName定位方式,ClassName一般都是会重复的,可以通过index来获取 ...

  3. Java SE 9(JDK9)环境安装及交互式编程环境Jshell使用示例

    目的 安装JDK 9, 练习Jshell工具的使用, 体验Java的交互式编程环境. 什么是Jshell 其实就是一个命令行工具,安装完JDK9后,可以在bin目录下找到该工具,与Python的解释器 ...

  4. PHP之高性能I/O框架:Libevent(三)

    Swoole Swoole里也提供了一些直接操作底层epoll/kqueue事件循环的接口,可将其他扩展创建的socket.PHP代码中stream/socket扩展创建的socket等加入到Swoo ...

  5. Django | 模型类变更后生成迁移文件,报错:You are trying to add a non-nullable field 'BookName' to BookInfo without a default....

    报错: You are trying to add a non-nullable field 'BookName' to BookInfo without a default; we can't do ...

  6. SQL 必知必会·笔记<6>使用数据处理函数

     与SQL 语句不一样,SQL 函数不是可移植的.为特定SQL 实现编写的代码在其他实现中可能不正常.因为各个DBMS厂商对函数的实现有很大的区别. 常用函数 大多数SQL 实现支持以下类型的函数: ...

  7. Jquery 跨域访问 Lightswitch OData Service

    修改lightswitch .server project web.config.添加如下内容就可以实现对ApplicationData.svc/跨域访问 <system.webServer&g ...

  8. /proc文件系统(一):cpuinfo

    0. 前言 /proc 文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间. 它以文件系统的方式为内核与进程提供通信的接口.用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某 ...

  9. Django学习(5)优雅地分页展示网页

    在我们平时浏览网页时,经常会遇到网页里条目很多的情形,这时就会用到分页展示的功能.那么,在Django中,是如何实现网页分类的功能的呢?答案是Paginator类. 本次分享讲具体展示如何利用Djan ...

  10. 无法初始化 PowerShell 主机解决方案

    Question无法初始化 PowerShell 主机.如果您的 PowerShell 执行策略设置设为 AllSigned,请先打开程序包管理器控制台以初始化该主机. --------------- ...