關於MySQL,你瞭解多少?_執行計畫,mysql瞭解執行計畫
一.資料庫儲存引擎
查看mysql版本:
查看當前mysql版本支援的儲存引擎:
本文只介紹兩種常用儲存引擎:
1. MyISAM
不支援交易處理
表鎖:發生死結機率高,相對並發也低
2. InnoDB(MySQL 5.5之後預設儲存引擎)
支援交易處理
行鎖:發生死結機率低,相對並發也高
3. 行鎖與表鎖的界定
SQL樣本:update stu set c1 = ? where c2 = ?;
行鎖:其他線程無法操作當前檢索的資料,但是可以操作其他行資料
表鎖:其他線程無法操作當前表資料
4. 查看資料表格儲存體引擎,指定資料表格儲存體引擎4.1 建立資料表
create table stu(
stuidint primary key auto_increment,
stunamevarchar(255),
stuageint,
studescriptionvarchar(255)
);
4.2 查看該資料表使用的儲存引擎
使用視覺化檢視查看該表資訊:
我們可以在建立資料表的時候指定儲存引擎:
去查看該表的DDL語句,探索資料庫在執行SQL表建立語句的時候預設給我們加了一部分內容,結尾部分即指定ENGINE=InnoDB,如果我們要指定使用其他的資料庫儲存引擎,可以在建立表的時候修改該值即可,但是不建議修改為其他儲存引擎!!!
二.資料庫索引
- PRIMARY KEY
- UNIQUE
- INDEX
- FULLTEXT
三.執行計畫
對於慢SQL的最佳化,從哪兒著手?
通過查看執行計畫,可以確認該SQL在執行的時候有沒有使用索引
在stu表中插入一部分類比資料:
insertinto stu(stuname,stuage,studescription) values('張三',18,'愛好下棋');
insertinto stu(stuname,stuage,studescription) values('李四',22,'今天狀態不佳');
insertinto stu(stuname,stuage,studescription) values('王五',16,'生病');
insertinto stu(stuname,stuage,studescription) values('趙六',21,'喜歡三國演義');
insertinto stu(stuname,stuage,studescription) values('田七',17,'最近在研究機器學習');
分別查看下列SQL語句的執行計畫:
select stuid,stuname,stuage,studescription from stu;
select stuname,stuage,studescription from stu where stuid = 3;
select stuname,stuage,studescription from stu where stuname = '田七';
select stuname,stuage,studescription from stu where stuid > 2;
下面分別對id | select_type | table | partitions | type | possible_keys |key | key_len | ref | rows | filtered | Extra欄位進行講解:
1. id
- 數字越大越先執行
- 如果數字一樣大,就從上往下執行
- 如果為null就表示這是一個結果集,不需要使用它來進行查詢
2. select_type
3. table
- 顯示查詢的表名,如果查詢使用了別名,那麼這兒顯示的是別名
- 如果不涉及對資料表的操作,顯示的是null
- 如果顯示的是<derived N>,表示這是一張暫存資料表,N即是執行計畫中的id,表示這張表來源於這次查詢
- 如果顯示的是<union M,N>,表示這是一張暫存資料表,表示這張表來源於union查詢id為M,N的結果集
4. partitions5. type
- 效能從好到差:system、const、eq_ref、ref、fulltext、ref_or_null、unique_subquery、index_subquery、range、index_merge、index、ALL
- 除了ALL以外,其他的type都可以使用到索引
- 除了index_merge以外,其他的type只可以使用到一個索引
- 不同連線類型的解釋
6. possible_keys
7. key
- 查詢實際使用到的索引,如果沒有,則為NULL
- 如果select_type為index_merge,這裡可能出現兩個以上索引
8. key_len
- 只計算where條件用到的索引長度,而排序和分組就算使用到了索引,也不會計算到key_len中
9. ref
- 如果是常量等值查詢,這裡顯示const
- 如果是串連查詢,被驅動表的執行計畫這裡會顯示驅動表的關聯欄位
- 如果查詢條件中使用了運算式或者函數,或者條件列發生隱式轉換,這裡可能顯示為func
10. rows
11. filtered
12. Extra
該列包含MySQL解決查詢的詳細資料,有以下幾種情況:
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。