轉載 From 松下客 @ 賽迪網
一、什麼是索引?
索引用來快速地尋找那些具有特定值的記錄,所有MySQL索引都以B-樹的形式保存。如果沒有索引,執行查詢時MySQL必須從第一個記錄開始掃瞄整個表 的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。如果作為搜索條件的列上已經創建了索引,MySQL無需掃瞄任何記錄 即可迅速得到目標記錄所在的位置。如果表有1000個記錄,通過索引查找記錄至少要比順序掃瞄記錄快100倍。
二、索引的類型
MySQL提供多種索引類型供選擇:
普通索引
這是最基本的索引類型,而且它沒有唯一性之類的限制
創建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
創建表的時候指定索引,例如CREATE TABLE tablename ( […], INDEX [索引的名字] (列的列表) );
唯一性索引
這種索引和前面的「普通索引」基本相同,但有一個區別
創建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
創建表的時候指定索引,例如CREATE TABLE tablename ( […], UNIQUE [索引的名字] (列的列表) );
主鍵
主鍵是一種唯一性索引,但它必須指定為「PRIMARY KEY」。如果你曾經用過AUTO_INCREMENT類型的列
全文索引
MySQL從3.23.23版開始支持全文索引和全文檢索。在MySQL中,全文索引的索引類型為FULLTEXT
三、單列索引與多列索引
索引可以是單列索引,也可以是多列索引。
四、最左前綴
多列索引還有另外一個優點,它通過稱為最左前綴(Leftmost Prefixing)的概念體現出來。
五、選擇索引列
在性能優化過程中,選擇在哪些列上創建索引是最重要的步驟之一。
六、分析索引效率
現在我們已經知道了一些如何選擇索引列的知識,但還無法判斷哪一個
「對於每一種與另一個表中記錄的組合,MySQL將從當前的表讀取
如果EXPLAIN顯示連接類型是「ALL」,而且你並不想從表裡
possible_keys:
可能可以利用的索引的名字。這裡的索引名字是創建索引時指定的索引
Key:
它顯示了MySQL實際使用的索引的名字。如果它為空
key_len:
索引中被使用部分的長度,以字節計。在本例中,key
ref:
它顯示的是列的名字(或單詞「const」),MySQL將根據這
rows:
MySQL所認為的它在找到正確的結果之前必須掃瞄的記錄數
Extra:
這裡可能出現釵h不同的選項,其中大多數將對查詢產生負面影響
七、索引的缺點
到目前為止,我們討論的都是索引的優點。事實上,索引也是有缺點的
首先,索引要佔用磁盤空間。通常情況下,這個問題不是很突出
第二,對於需要寫入數據的操作,比如DELETE
【結語】在大型數據庫中,索引是提高速度的一個關鍵因素
看來之前 Zero 大大已經走過在下的現在的路了!