MySQL查询优化笔记整理

MySQL查询优化笔记整理

一、开启慢查询日志

1、先设置慢查询时间

--long_query_time是用来定义慢于多少秒的才算“慢查询”
MySQL> show variables like 'long%';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)



--设置为5, 也就是执行时间超过5秒的都算慢查询。
MySQL> set long_query_time=5;
Query OK, 0 rows affected (0.00 sec)

2、查看是否打开慢查询日志记录

MySQL> show variables like 'slow%';
+------------------------------------+-------------------------+
| Variable_name                      | Value                   |
+------------------------------------+-------------------------+
| slow_launch_time                   | 2                       |
| slow_query_log                     | ON                      |
| slow_query_log_always_write_time   | 10.000000               |
| slow_query_log_file                | /var/log/mysql-slow.log |
| slow_query_log_timestamp_always    | OFF                     |
| slow_query_log_timestamp_precision | second                  |
| slow_query_log_use_global_control  |                         |
+------------------------------------+-------------------------+
7 rows in set (0.00 sec)


--打开日志记录
MySQL> set global slow_query_log='ON';

一旦slow_query_log变量被设置为ON,mysql会立即开始记录。
/etc/my.cnf 里面可以设置上面MYSQL全局变量的初始值。
long_query_time=10
slow_query_log_file=/var/log/mysql-slow.log

3、分析慢日志方案

方法一:pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog、General log、slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdump抓取的MySQL协议数据来进行分析。可以把分析结果输出到文件中,分析过程是先对查询语句的条件进行参数化,然后对参数化以后的查询进行分组统计,统计出各查询的执行时间、次数、占比等,可以借助分析结果找出问题进行优化。


方法二: mysqldumpslow命令
/path/mysqldumpslow -s c -t 10 /tmp/slow-log
这会输出记录次数最多的10条SQL语句,其中:

-s, 是表示按照何种方式排序,c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序,ac、at、al、ar,表示相应的倒叙;
-t, 是top n的意思,即为返回前面多少条的数据;
-g, 后边可以写一个正则匹配模式,大小写不敏感的;
比如
mysqldumpslow -s r -t 10 /tmp/slow-log
得到返回记录集最多的10个查询。
mysqldumpslow -s t -t 10 -g “left join” /tmp/slow-log
得到按照时间排序的前10条里面含有左连接的查询语句。
mysqldumpslow -s at,al /var/log/mysql-slow.log

按照最大耗用时间排最后,只显示2条的方式格式化日志文件  
mysqldumpslow -r -t 2 /var/log/mysql-slow.log

mysqldumpslow --help

4、参考资料

MySQL慢查询(二) - pt-query-digest详解慢查询日志
http://www.cnblogs.com/luyucheng/p/6265873.html


使用Anemometer基于pt-query-digest将MySQL慢查询可视化
http://www.cnblogs.com/xuanzhi201111/p/4128894.html


好文推荐:五款常用mysql slow log分析工具的比较
http://www.neatstudio.com/show-1324-1.shtml

二、EXPLAIN

1.EXPLAIN字段解释

ØTable:显示这一行的数据是关于哪张表的

Øpossible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句

Økey:实际使用的索引。如果为NULL,则没有使用索引。MYSQL很少会选择优化不足的索引,此时可以在SELECT语句中使用USE INDEX(index)来强制使用一个索引或者用IGNORE INDEX(index)来强制忽略索引

Økey_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好

Øref:显示索引的哪一列被使用了,如果可能的话,是一个常数

Ørows:MySQL认为必须检索的用来返回请求数据的行数

Øtype:这是最重要的字段之一,显示查询使用了何种类型。从最好到最差的连接类型为system、const、eq_reg、ref、range、index和ALL
system、const:可以将查询的变量转为常量. 如id=1; id为 主键或唯一键.
eq_ref:访问索引,返回某单一行的数据.(通常在联接时出现,查询使用的索引为主键或惟一键)
ref:访问索引,返回某个值的数据.(可以返回多行) 通常使用=时发生
range:这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西,并且该字段上建有索引时发生的情况(注:不一定好于index)
index:以索引的顺序进行全表扫描,优点是不用排序,缺点是还要全表扫描
ALL:全表扫描,应该尽量避免

ØExtra:关于MYSQL如何解析查询的额外信息,主要有以下几种
using index:只用到索引,可以避免访问表.
using where:使用到where来过虑数据. 不是所有的where clause都要显示using where. 如以=方式访问索引.

using tmporary:用到临时表
using filesort:用到额外的排序. (当使用order by v1,而没用到索引时,就会使用额外的排序)
range checked for eache record(index map:N):没有好的索引.

2.参考资料

mysql explain详解
http://www.javaranger.com/archives/1614

MYSQL explain的使用 一个用户SQL慢查询分析,原因及优化 Range checked for each record (index map: 0x4) |
http://www.cnblogs.com/MYSQLZOUQI/articles/3837828.html

三、索引及查询优化

mysql慢查询原因分析与解决(三)——索引及查询优化
http://www.javaranger.com/archives/1500

MySQL索引原理与慢查询优化
http://www.javaranger.com/archives/1728


“Group by”的”隐形杀手”
http://www.javaranger.com/archives/771


MySQL运行状态show status中文详解
http://www.javaranger.com/archives/1480


mysql>show processlist命令详解
http://www.javaranger.com/archives/1487

四、配置优化

mysql慢查询原因分析与解决(四)——配置优化
http://www.javaranger.com/archives/1503

五、其他

美团SQL优化工具SQLAdvisor
http://www.ttlsa.com/mysql/meituan-sql-optimization-tool-sqladvisor/

一张思维导图学会如何构建高性能MySQL系统!
http://dbaplus.cn/news-11-1324-1.html
https://mp.weixin.qq.com/s/OBIOAjHo5k8ioNz-F2LoQA
posted @ 2018-02-21 19:41  一片相思林  阅读(154)  评论(0编辑  收藏  举报