1. MySQL優化-查看執行記錄 MySQL 提供了一個 EXPLAIN 命令, 它可以對 SELECT 語句進行分析, 並輸出 SELECT 執行的詳細信息, 以供開發人員針對性優化。 使用explain這個命令來查看一個這些SQL語句的執行計劃,查看該SQL語句有沒有使用上了索引,有沒有做全表 ...
1. MySQL優化-查看執行記錄
MySQL 提供了一個 EXPLAIN 命令, 它可以對 SELECT 語句進行分析, 並輸出 SELECT 執行的詳細信息, 以供開發人員針對性優化。
使用explain這個命令來查看一個這些SQL語句的執行計劃,查看該SQL語句有沒有使用上了索引,有沒有做全表掃描,這都可以通過explain命令來查看。
EXPLAIN 命令用法十分簡單, 在 SELECT 語句前加上 explain 就可以了, 例如:
1.1 SQL語句優化-explain分析問題
expain出來的信息有10列,分別是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra,下麵對這些欄位進行解釋:
id: select查詢的標識符. 每個 select都會自動分配一個唯一的標識符.
select_type:表示查詢的類型。
table:輸出結果集的表
type:表示表的連接類型
possible_keys:表示查詢時,可能使用的索引
key:表示實際使用的索引
key_len:索引欄位的長度
ref:哪個欄位或常數與key一起被使用
rows:掃描出的行數(估算的行數)
Extra:執行情況的描述和說明
1.1.1 id
SELECT識別符。這是SELECT的查詢序列號
1.1.2 select_type
PRIMARY :子查詢中最外層查詢
SUBQUERY : 子查詢內層第一個SELECT,結果不依賴於外部查詢
DEPENDENT SUBQUERY:子查詢內層第一個SELECT,依賴於外部查詢
UNION :UNION語句中第二個SELECT開始後面所有SELECT,
SIMPLE:簡單的 select 查詢,不使用 union 及子查詢
UNION :UNION 中的第二個或隨後的 select 查詢,不依賴於外部查詢的結果集
1.1.3 Table
顯示這一步所訪問資料庫中表名稱
1.1.4 Type
對錶訪問方式
ALL:
SELECT * FROM emp \G
完整的表掃描通常不好
SELECT * FROM (SELECT * FROM emp WHERE empno = 1) a ;
system:表僅有一行(=系統表)。這是const聯接類型的一個特
const:表最多有一個匹配行
1.1.5 Possible_keys
該查詢可以利用的索引,如果沒有任何索引顯示 null
1.1.6 Key
Mysql 從 Possible_keys 所選擇使用索引
1.1.7 Rows
2. MySQL優化-慢查詢
MySQL的慢查詢,全名是慢查詢日誌,是MySQL提供的一種日誌記錄,用來記錄在MySQL中響應時間超過閥值的語句。具體環境中,運行時間超過long_query_time
值的SQL語句,則會被記錄到慢查詢日誌中。簡單的說就是運行很長時間的sql語句
MySQL的慢查詢日誌功能,預設是關閉的,需要手動開啟。
2.1 查看是否開啟慢查詢
Ø slow_query_log :是否開啟慢查詢日誌,ON 為開啟,OFF 為關閉,如果為關閉可以開啟。
Ø log-slow-queries :舊版(5.6以下版本)MySQL資料庫慢查詢日誌存儲路徑。可以不設置該參數,系統則會預設給一個預設的文件host_name-slow.log
Ø slow-query-log-file:新版(5.6及以上版本)MySQL資料庫慢查詢日誌存儲路徑。可以不設置該參數,系統則會預設給一個預設的文件host_name-slow.log
Ø long_query_time :慢查詢閾值,當查詢時間多於設定的閾值時,記錄日誌,單位為秒。
2.2 臨時開啟慢查詢功能
在 MySQL 執行 SQL 語句設置,但是如果重啟 MySQL 的話將失效
set global slow_query_log = ON; set global long_query_time = 1;
2.3 永久開啟慢查詢功能
修改/etc/my.cnf配置文件,重啟 MySQL, 這種永久生效. [mysqld]
slow_query_log = ON slow_query_log_file = /var/log/mysql/slow.log long_query_time = 1
2.4 慢查詢格式
說明:
第一行,SQL查詢執行的時間
第二行,執行SQL查詢的連接信息,用戶和連接IP
第三行,記錄了一些我們比較有用的信息,如下解析
Query_time,這條SQL執行的時間,越長則越慢
Lock_time,在MySQL伺服器階段(不是在存儲引擎階段)等待表鎖時間
Rows_sent,查詢返回的行數
Rows_examined,查詢檢查的行數,越長就當然越費時間
第四行,設置時間戳,沒有實際意義,只是和第一行對應執行時間。
第五行及後面所有行(第二個# Time:之前),執行的sql語句記錄信息,因為sql可能會很長
3. MySQL優化-profiling分析查詢
通過慢日誌查詢可以知道哪些SQL語句執行效率低下,通過explain我們可以得知SQL語句的具體執行情況,索引使用等,還可以結合show命令查看執行狀態。
如果覺得explain的信息不夠詳細,可以同通過profiling命令得到更準確的SQL執行消耗系統資源的信息。
profiling預設是關閉的。可以通過以下語句查看
打開功能: mysql>set profiling=1; --1是開啟、0是關閉
執行需要測試的sql 語句:
mysql> show profiles\G; 可以得到被執行的SQL語句的時間和ID mysql>show profile for query 1; 得到對應SQL語句執行的詳細信息 show profile命令格式: SHOW PROFILE [type [, type] … ] [FOR QUERY n] [LIMIT row_count [OFFSET offset]] type: ALL | BLOCK IO | CONTEXT SWITCHES | CPU | IPC | MEMORY | PAGE FAULTS | SOURCE | SWAPS
以上的16rows是針對非常簡單的select語句的資源信息,對於較複雜的SQL語句,會有更多的行和欄位,比如converting HEAP to MyISAM 、Copying to tmp table等等,由於以上的SQL語句不存在複雜的表操作,所以未顯示這些欄位。通過profiling資源耗費信息,我們可以採取針對性的優化措施。
測試完畢以後,關閉參數:mysql> set profiling=0
4. MySQL鎖
資料庫鎖定機制簡單來說,就是資料庫為了保證數據的一致性,而使各種共用資源在被併發訪問變得有序所設計的一種規則。對於任何一種資料庫來說都需要有相應的鎖定機制,所以MySQL自然也不能例外。
MySQL資料庫由於其自身架構的特點,存在多種數據存儲引擎,每種存儲引擎所針對的應用場景特點都不太一樣,為了滿足各自特定應用場景的需求,每種存儲引擎的鎖定機制都是為各自所面對的特定場景而優化設計,所以各存儲引擎的鎖定機制也有較大區別。
MySQL各存儲引擎使用了三種類型(級別)的鎖定機制:表級鎖定,行級鎖定和頁級鎖定。
4.1 表級鎖定(table-level)
表級別的鎖定是MySQL各存儲引擎中最大顆粒度的鎖定機制。該鎖定機制最大的特點是實現邏輯非常簡單,帶來的系統負面影響最小。所以獲取鎖和釋放鎖的速度很快。由於表級鎖一次會將整個表鎖定,所以可以很好的避免困擾我們的死鎖問題。
當然,鎖定顆粒度大所帶來最大的負面影響就是出現鎖定資源爭用的概率也會最高,致使並大度大打折扣。
使用表級鎖定的主要是MyISAM,MEMORY,CSV