一、mysql的索引
索引是幫助mysql高效獲取數據的數據結構。本質:索引是數據結構
1:索引分類
普通索引:一個索引只包含單個列,一個表可以有多個單列索引。
唯一索引:索引列的值必須唯一 ,但允許有空值。
復合索引:一個索引包含多個列。
聚集索引:並不是一種單獨的索引類型,而是一種數據存儲方式。innodb磁盤存儲,.ibd數據和索引放在一個文件夾下。
非聚集索引:不是聚集索引的,就是非聚集索引。
2:語法
查看索引 show index from table;
創建索引
create [unique] index indexname on table(columnname(length));
alter table 表名 add [unique] index [indexname] on (columnname(length));
刪除索引 drop index [indexName] on table;
3:適合建索引
某一列相對來說唯一
經常用來查詢顯示的列
經常用來關聯的列 where 條件中用到的列,以及join on 用到的列
二、mysql的執行計划
使用explan關鍵字可以知道mysql是如何處理SQL語句的。
id:相同,都不相同,不全部相同。
相同:獲取select的執行順序。執行順序由上到下。
都不相同:如果是子查詢,id序號會遞增,id值越大優先級越高,越先被執行。
不全部相同:id相同的認為一組,從上往下順序執行。在所有組中,id值越大,優先級越高,越先被執行。
select_type:查詢的類型
simple:簡單的SQL語句,不包含union或者子查詢。
primary:查詢中包含任何的子查詢,最外層查詢被標記。
subquery:在select和where中,查詢的任何子查詢。
derived:在from列表中包含子查詢會被標記為derived,mysql會遞歸執行這些子查詢,把結果放到臨時表。
union:若第二個select出現在union之后,則標記為UNION;若UNION包含在from子句的子查詢中,外層select將被標記為derived。
union result:從union表獲取結果的select。
table:查詢來自那張表
type:訪問的類型,重要的一個指標,結果從最好到最壞。
system》const》eq_ref>ref>range>index>all,最好達到ref或者range
system:表中只有一條記錄(等於系統表),這是const類型的特例,平時不會出現,這個可以忽略不計。
const:表示通過索引一次就找到了。用於primary或unique索引。因為只匹配一行數據。
eq_ref:唯一索引掃描,對於每個索引建,表中只有一條記錄匹配。常見於主鍵或唯一索引掃描。
ref:非唯一索引掃描,返回匹配某個單獨值的所有行。
rang:只檢索給定范圍內的行,使用一個索引來選擇行。key列顯示使用那個索引,一般就是在你的where語句中出現between、<、>、in查詢中。
index:當查詢的結果全為索引列的時候。也是全表掃描的一種。只不過掃描的全部索引。
all:全表掃描。
注:當出現index和all的時候,就應該去優化SQL語句。
key:實際所用的索引。如果為null,則沒有使用索引。
possible_key:可能用到的key。possible_key有數據,但是不一定會使用key。key有數據,但是不一定會使用possible_key。這兩者比一定都同時出現。
key_len:表示索引使用的字節數,通過該列查詢使用索引的長度。在不損失精確性的情況下,長度越短越好。
ref:顯示索引的哪一列被使用了,如果可能得話,是一個常數。
rows:根據表的以及索引選用的情況,大致估算出需要讀取的行數。掃描的行數越少越好。
extra:包含不適合在其他列中顯示,但重要的額外信息。