談到MySQL不得不說的就是你們都會遇到的性能問題,今天就記錄一下SQL優化相關的技巧。php
經過檢查SQL語句的狀態有助於MySQL的優化,首先介紹 show status命令sql
//檢查當前會話的狀態 SHOW SESSION STATUS; //檢查全局狀態 SHOW GLOBAL STATUS;
這個命令能夠查看到MySQL中sql語句的執行狀態,具體的以下:json
參數 | 說明 |
---|---|
Com_select | SELECT查詢次數 |
Com_insert | INSERT操做次數 |
Com_update | update更新次數 |
Com_delete | delete操做次數 |
innodb_rows_read性能 innodb_rows_inserted優化 innodb_rows_updatedspa innodb_rows_deletedcode |
select查詢返回行數orm update、insert、delete操做次數索引 |
Connections | MySQL累計鏈接次數 |
Slow_queries | 慢查詢次數 |
Handler_read_key | 索引查詢數 |
Handler_read_rnd_next | 讀取下一行的次數 |
經過以上的數據,能夠檢查出MySQL鏈接數量,決定是否使用連接池,索引利用率。ci
根據讀寫情況,能夠了解到選擇什麼樣的存儲引擎更加合適。
相信你們都不陌生多explain命令,用於檢查SQL語句的執行計劃,在索引優化的時候必不可少。
每次項目前都會開着SlowLog去壓測,而後把滿查詢經過explain去分析。
首先介紹一下這個命令的經常使用用法:
//檢查SQL語句執行計劃 explain select * from user where username = 'fuckphp'; //查詢MySQL優化後但語句執行計劃 explain extended select * from user where username = 'fuckphp'; //查詢MySQL分區信息的執行計劃 explain partitions select * from user where username = 'fuckphp';
字段 | 描述 | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id | 每一個SELECT分配的ID | ||||||||||||||
select_type |
|
||||||||||||||
table | 表名 | ||||||||||||||
type |
|
||||||||||||||
possible_keys | 可能用到的索引 | ||||||||||||||
key | 查詢用到的索引 | ||||||||||||||
key_len | 索引長度 | ||||||||||||||
rows | 檢索行數 | ||||||||||||||
Extra | 補充信息 | ||||||||||||||
ref | 與key一同檢索的字段或常數 |
除了explain還有show profile這個神器,來幫咱們分析SQL語句的執行過程。
//查看是否支持 show @@have_profiling; //在會話中開啓profile set profiling=1; //查詢當前會話執行過的SQL 包含queryid 查詢時間、查詢語句 show profiles; //根據queryid查詢執行過程當中的時間 show profile for query queryid; //查詢所有執行信息 show profile all for query queryid; //查詢source、cpu、block io、context、page faults等信息 更多查看help profile; show profile cpu for query queryid;
這個神器會在將來版本中被MySQL廢除掉,已經不建議使用,官方建議在performance_schema的PROFILING表中進行查詢。
MySQL5.6之後,可使用strace命令對SQL語句進行追蹤。
//開啓strace SET OPTIMIZER_TRACE="enabled=on"; //設置strace 輸出格式爲json SET END_MARKERS_IN_JSON=on; //查詢SQL信息 select * from information_schema.OPTIMIZER_TRACE\G
在這個結果中能夠查看到MySQL對條件的優化,恆等條件的優化等信息,便於查詢出性能瓶頸。