一、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:包含不适合在其他列中顯示,但重要的額外資訊。
mysql的索引和執行計劃
标簽:ref column 處理 其他 全表掃描 現在 一個 适合 計劃
本條技術文章來源于網際網路,如果無意侵犯您的權益請點選此處回報版權投訴
本文系統來源:https://www.cnblogs.com/orange-time/p/10595619.html