一、锁定目标
1.1、分析思路
- 1、开启慢查询日志,设置阈值,定位慢SQL,并抓取出来
- 2、使用Explain + 慢SQL 分析
- 3、show profile
- 4、调整数据库参数
1.2、优化原则
小表驱动大表,即小的数据集驱动大的数据集
SELECT * FROM A WHERE id IN (SELECT id FROM B)
等价于
SELECT id FROM B
SELECT * FROM A WHERE id in ()
- B表的数据集必须小于 A表的数据集时,用 in 优于 exists
1.3、EXISTS
SELECT ... FROM TABLE WHERE EXISTS (subquery)
- 将主查询的数据,放到子查询中做条件验证,根据验证结果(true 或 false)来决定主查询的数据结果是否得以保留
SELECT * FROM A WHERE EXISTS (SELECT 1 FROM B WHERE B.id = A.id)
等价于
SELECT * FROM A
SELECT * FROM B WHERE B.id = A.id
- A表的数据集小于B表的数据时,用exists优于in
二、定位慢SQL
默认情况下,MySQL数据库没有开启慢查询日志,需要我们手动来设置这个参数
2.1、查询是否开启慢查询
SHOW VARIABLES LIKE '%slow_query_log%'

2.2、开启慢查询
SET GLOBAL slow_query_log=1

- 只对当前数据库生效,如果MySQL重启后则会失效
2.3、永久开启慢查询
- 修改配置文件 my.cnf
- mysqld下增加或修改参数
slow_query_log=1
slow_query_log_file=/usr/local/var/mysql/zijingqiuxue-slow.log
2.4、慢查询默认值修改
SHOW VARIABLES LIKE 'long_query_time%'

可以使用命令修改,也可以在my.cnf参数里修改
2.5、修改默认值
SET GLOBAL long_query_time = 3
- 查看修改
SHOW GLOBAL VARIABLES LIKE 'long_query_time%'

2.6、查询当前系统中有多少条慢查询记录
SHOW GLOBAL STATUS LIKE '%Slow_queries%'

三、mysqldumpslow --help
--verbose verbose
--debug debug
--help write this text to standard output
-v verbose
-d debug
-s ORDER what to sort by (al, at, ar, c, l, r, t), 'at' is default
al: average lock time
ar: average rows sent
at: average query time
c: count
l: lock time
r: rows sent
t: query time
-r reverse the sort order (largest last instead of first)
-t NUM just show the top n queries
-a don't abstract all numbers to N and strings to 'S'
-n NUM abstract numbers with at least n digits within names
-g PATTERN grep: only consider stmts that include this string
-h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard),
default is '*', i.e. match all
-i NAME name of server instance (if using mysql.server startup script)
-l don't subtract lock time from total time
- s:是表示按照何种方式排序
- c:访问次数
- i:锁定时间
- r:返回记录
- t:查询时间
- al:平均锁定时间
- ar:平均返回记录数
- at:平均查询时间
- t:返回前面多少条的数据
- g:后边搭配一个正则匹配模式,大小写不敏感
3.1、得到返回记录集最多的10个SQL
mysqldumpslow -s r -t 10 /usr/local/var/mysql/zijingqiuxue-slow.log
3.2、得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /usr/local/var/mysql/zijingqiuxue-slow.log
3.3、集合more使用
mysqldumpslow -s c -t 10 /usr/local/var/mysql/zijingqiuxue-slow.log | more
网友评论