index-B
優勢
類似大學圖書館建書目索引,提高數據檢索的效率,降低數據庫的IO成本
通過索引列對數據進行排序,降低數據排序的成本,降低了CPU的消耗
?
劣勢
實際上索引也是一張表,該表保存了主鍵與索引字段,并指向實體表的記錄,所以索引列也是要占用空間的
雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件每次更新添加了索引列的字段,都會調整因為更新所帶來的鍵值變化后的索引信息
索引只是提高效率的一個因素,如果你的MySQL有大數據量的表,就需要花時間研究建立最優秀的索引,或優化查詢語句
?
分類
單值索引
即一個索引只包含單個列,一個表可以有多個單列索引
唯一索引
索引列的值必須唯一,但允許有空值
復合索引
即一個索引包含多個列
基本語法
創建
CREATE ?[UNIQUE ] INDEX indexName ON mytable(columnname(length));?
ALTER TABLE 表名 ADD ?[UNIQUE ] ?INDEX [indexName] ON (columnname(length))?
刪除
DROP INDEX [indexName] ON mytable;?
查看
SHOW INDEX FROM table_name\G
使用ALTER命令
有四種方式來添加數據表的索引:
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句添加一個主鍵,這意味著索引值必須是唯一的,且不能為NULL。
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句創建索引的值必須是唯一的(除了NULL外,NULL可能會出現多次)。
ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出現多次。
?
Explain
各字段解釋
id
select查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序
三種情況
id相同,執行順序由上至下
id相同,執行順序由上至下
id不同,如果是子查詢,id的序號會遞增,id值越大優先級越高,越先被執行
如果是子查詢,id的序號會遞增,id值越大優先級越高,越先被執行
id相同不同,同時存在
id如果相同,可以認為是一組,從上往下順序執行;
在所有組中,id值越大,優先級越高,越先執行
衍生 = DERIVED
?
select_type
有哪些
查詢的類型,主要是用于區別
普通查詢、聯合查詢、子查詢等的復雜查詢
1. SIMPLE
簡單的 select 查詢,查詢中不包含子查詢或者UNION
2. PRIMARY
查詢中若包含任何復雜的子部分,最外層查詢則被標記為
3. SUBQUERY
在SELECT或WHERE列表中包含了子查詢
4. DERIVED
在FROM列表中包含的子查詢被標記為DERIVED(衍生)MySQL會遞歸執行這些子查詢, 把結果放在臨時表里。
5. UNION
若第二個SELECT出現在UNION之后,則被標記為UNION;
若UNION包含在FROM子句的子查詢中,外層SELECT將被標記為:DERIVED
6. UNION RESULT
從UNION表獲取結果的SELECT
?
table
顯示這一行的數據是關于哪張表的
?
type
訪問類型排列
type顯示的是訪問類型,是較為重要的一個指標,結果值從最好到最壞依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL?
system>const>eq_ref>ref>range>index>ALL
一般來說,得保證查詢至少達到range級別,最好能達到ref。
?
顯示查詢使用了何種類型,從最好到最差依次是:system>const>eq_ref>ref>range>index>ALL
system
表只有一行記錄(等于系統表),這是const類型的特列,平時不會出現,這個也可以忽略不計
const
表示通過索引一次就找到了,const用于比較primary key或者unique索引。因為只匹配一行數據,所以很快如將主鍵置于where列表中,MySQL就能將該查詢轉換為一個常量
eq_ref
唯一性索引掃描,對于每個索引鍵,表中只有一條記錄與之匹配。常見于主鍵或唯一索引掃描
ref
非唯一性索引掃描,返回匹配某個單獨值的所有行.
本質上也是一種索引訪問,它返回所有匹配某個單獨值的行,然而,
它可能會找到多個符合條件的行,所以他應該屬于查找和掃描的混合體
range
只檢索給定范圍的行,使用一個索引來選擇行。key 列顯示使用了哪個索引
一般就是在你的where語句中出現了between、<、>、in等的查詢
這種范圍掃描索引掃描比全表掃描要好,因為它只需要開始于索引的某一點,而結束語另一點,不用掃描全部索引。
index
Full Index Scan,index與ALL區別為index類型只遍歷索引樹。這通常比ALL快,因為索引文件通常比數據文件小。
(也就是說雖然all和Index都是讀全表,但index是從索引中讀取的,而all是從硬盤中讀的)
all
Full Table Scan,將遍歷全表以找到匹配的行
備注:一般來說,得保證查詢至少達到range級別,最好能達到ref。
?
總結