慢查询

如何通过慢查日志发现有问题的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. 移动端 h5开发相关内容总结(三)

    之前写过两篇开发中遇到的问题和解决方案.当时是CSS 和 JavaScript 分开写的.现在写这篇文章的时候感觉很多内容都是有内在联系的,所以不好分开. 给大家分享一下这半年来的感受吧: 知道和理解 ...

  2. MVC5笔记

    创建一个MVC网站后,我们可以在/app_strat/routeConfig.cs中来查看集中控制路的方法,RegisterRoutes方法(注册路由),我们改一下,删除默认的RegisterRout ...

  3. SQL 必知必会·笔记<13>插入数据

    INSERT 用来将行插入(或添加)到数据库表.插入有几种方式: 插入完整的行: 插入行的一部分: 插入某些查询的结果. 1.1 插入完整的行 存储到表中每一列的数据在VALUES 子句中给出,必须给 ...

  4. zabbix 自定义监控项简单案例

    例如:获取被监控主机的登录用户数 以uptime为例: 输入命令:uptime | awk '{print $6}'  可以获得当前登录用户数(不通终端打印出的位置不同) 1.被监控主机修改zabbi ...

  5. JS nodeList转数组,兼容IE低版本

    一.前言 nodeList转数组貌似很少会这样去操作,但我在做图片懒加载时,我获取了所有需要做懒加载的img元素,也就是一个NodeList对象,打个比方: 对这些元素进行src修改后,我想将此项从N ...

  6. 百度umeditor富文本编辑器插件扩展

    富文本编辑器在WEB开发中经常用到,个人比较喜欢用百度出的ueditor这款,ueditor这款本身支持插件扩展的,但是ueditor的mini版本 umeditor 就没有那么方便了,不过找了很多资 ...

  7. HAProxy(二):HAProxy的ACL规则实现智能负载均衡详解与示例

    一.HAProxy的ACL的功能 ACL(Access Control List)访问控制列表,HAProxy中的ACL的匹配条件和控制条件有许多种,功能很强大,可以通过源地址.源端口.目标地址.目标 ...

  8. Extjs4---Cannot read property 'addCls' of null 或者 el is null 关于tab关闭后再打开不显示或者报错

    做后台管理系统时遇到的问题,关于tab关闭后再打开不显示,或者报错 我在新的tabpanel中加入了一个grid,当我关闭再次打开就会报错Cannot read property 'addCls' o ...

  9. HTML 中获取现在时间,实时时间获取

    JavaScript   Date 对象 Date 对象用于处理日期与实际. 创建 Date 对象: var now  =  new Date(). 方法 描述 getDate() 从 Date 对象 ...

  10. session持久化到sqlserver

    每次想使用都会忘记单词,所幸记录下来.简单步骤记录. 第一步:找到cmd目录 输入:cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 进入该目录. 第二 ...