定位慢查詢sql語句
可以通過開啟慢查詢來將所有的慢查詢記錄到某個(gè)文件里面酪碘,這里以slow-query.log為例
方式一:通過工具分析
MySQL自帶了mysqldumpslow工具用來分析slow query日志胰蝠,除此之外拘鞋,還有一些好用的開源工具脐嫂。比如MyProfi搔谴、mysql-log-filter毅戈,當(dāng)然還有mysqlsla等
以下是mysqldumpslow常用參數(shù)說明觉渴,詳細(xì)的可應(yīng)用mysqldumpslow -help查詢。
- -s座咆,是表示按照何種方式排序痢艺,c、t介陶、l堤舒、r分別是按照記錄次數(shù)、時(shí)間斤蔓、查詢時(shí)間植酥、返回的記錄數(shù)來排序(從大到卸频骸)弦牡,ac、at漂羊、al驾锰、ar表示相應(yīng)的倒敘。
- -t走越,是top n的意思椭豫,即為返回前面多少條數(shù)據(jù)。
- -g旨指,后邊可以寫一個(gè)正則匹配模式赏酥,大小寫不敏感。
接下來就是用mysql自帶的慢查詢工具mysqldumpslow分析了(mysql的bin目錄下)谆构,我這里的日志文件名字是slow-query.log裸扶。
列出記錄次數(shù)最多的10個(gè)sql語句
mysqldumpslow -s c -t 10 slow-query.log
列出返回記錄集最多的10個(gè)sql語句
mysqldumpslow -s r -t 10 slow-query.log
按照時(shí)間返回前10條里面含有左連接的sql語句
mysqldumpslow -s t -t 10 -g "left join" slow-query.log
使用mysqldumpslow命令可以非常明確的得到各種我們需要的查詢語句,對MySQL查詢語句的監(jiān)控搬素、分析呵晨、優(yōu)化起到非常大的幫助。
方式二:直接分析mysql慢查詢?nèi)罩?/h6>
Time Id Command Argument
# Time: 180419 10:17:15
# User@Host: root[root] @ localhost [::1]
# Thread_id: 2 Schema: QC_hit: No
# Query_time: 3.018396 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
# Rows_affected: 0
SET timestamp=1524104235;
SELECT `h_room_item`.`id`, `h_room_item`.`num`, `h_room_item`.`code`, `h_order`.`ord_no`, `h_order`.`stat`, `h_order`.`sex`, `h_order`.`end_dat`, `h_order`.`start_dat`, `h_item_flag`.`flag_id` FROM `h_room_item` LEFT JOIN `h_item_flag` ON h_item_flag.room_id=h_room_item.id LEFT JOIN `h_order` ON h_order.room_no=h_room_item.num and h_order.code=h_room_item.code WHERE (`h_room_item`.`code`='qt001') AND (`h_item_flag`.`flag_id` IN ('5', '6', '7', '9', '17', '18', '19', '20', '21')) ORDER BY `h_room_item`.`id` LIMIT 24;
Time Id Command Argument
# Time: 180419 10:17:15
# User@Host: root[root] @ localhost [::1]
# Thread_id: 2 Schema: QC_hit: No
# Query_time: 3.018396 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
# Rows_affected: 0
SET timestamp=1524104235;
SELECT `h_room_item`.`id`, `h_room_item`.`num`, `h_room_item`.`code`, `h_order`.`ord_no`, `h_order`.`stat`, `h_order`.`sex`, `h_order`.`end_dat`, `h_order`.`start_dat`, `h_item_flag`.`flag_id` FROM `h_room_item` LEFT JOIN `h_item_flag` ON h_item_flag.room_id=h_room_item.id LEFT JOIN `h_order` ON h_order.room_no=h_room_item.num and h_order.code=h_room_item.code WHERE (`h_room_item`.`code`='qt001') AND (`h_item_flag`.`flag_id` IN ('5', '6', '7', '9', '17', '18', '19', '20', '21')) ORDER BY `h_room_item`.`id` LIMIT 24;
使用desc或者explain來分析sql語句
desc SELECT `h_room_item`.`id`, `h_room_item`.`num`, `h_room_item`.`code`,
`h_order`.`ord_no`, `h_order`.`stat`, `h_order`.`sex`, `h_order`.`end_dat`,
`h_order`.`start_dat`, `h_item_flag`.`flag_id` FROM `h_room_item` LEFT JOIN
`h_item_flag` ON h_item_flag.room_id=h_room_item.id LEFT JOIN `h_order` ON
h_order.room_no=h_room_item.num and h_order.code=h_room_item.code WHERE
(`h_room_item`.`code`='qt001') AND (`h_item_flag`.`flag_id` IN ('5', '6', '7', '9', '17', '18',
'19', '20', '21')) ORDER BY `h_room_item`.`id` LIMIT 24\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: h_item_flag
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 28
Extra: Using where; Using temporary; Using filesort
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: h_room_item
type: eq_ref
possible_keys: PRIMARY,index2
key: PRIMARY
key_len: 4
ref: hotel_door.h_item_flag.room_id
rows: 1
Extra: Using where
*************************** 3. row ***************************
id: 1
select_type: SIMPLE
table: h_order
type: ALL
possible_keys: index3
key: NULL
key_len: NULL
ref: NULL
rows: 10
Extra: Using where; Using join buffer (flat, BNL join)
3 rows in set (0.60 sec)
可能原因:
- 1熬尺、沒有索引或者沒有用到索引(這是查詢慢最常見的問題摸屠,是程序設(shè)計(jì)的缺陷)
- 2、I/O吞吐量小粱哼,形成了瓶頸效應(yīng)季二。
- 3、沒有創(chuàng)建計(jì)算列導(dǎo)致查詢不優(yōu)化揭措。
- 4戒傻、內(nèi)存不足
- 5税手、網(wǎng)絡(luò)速度慢
- 6、查詢出的數(shù)據(jù)量過大(可以采用多次查詢需纳,其他的方法降低數(shù)據(jù)量)
- 7芦倒、鎖或者死鎖(這也是查詢慢最常見的問題,是程序設(shè)計(jì)的缺陷)
- 8不翩、sp_lock,sp_who,活動的用戶查看,原因是讀寫競爭資源兵扬。
- 9、返回了不必要的行和列
- 10口蝠、查詢語句不好器钟,沒有優(yōu)化