1. 程式人生 > >MySQL中設計索引規則

MySQL中設計索引規則

索引的設計可以遵循一些已有的原則,建立索引的時候請儘量考慮符合這些原則,便於 提升索引的使用效率,更高效地使用索引。

1、 搜尋的索引列,不一定是所要選擇的列。換句話說,最適合索引的列是出現在 WHERE

子句中的列,或連線子句中指定的列,而不是出現在 SELECT 關鍵字後的選擇列表中的列。

 2、使用惟一索引。考慮某列中值的分佈。索引的列的基數越大,索引的效果越好。例

如,存放出生日期的列具有不同值,很容易區分各行。而用來記錄性別的列,只含有“ M”

和“F”,則對此列進行索引沒有多大用處,因為不管搜尋哪個值,都會得出大約一半的行。

 3、使用短索引。如果對字串列進行索引,應該指定一個字首長度,只要有可能就應

該這樣做。例如,如果有一個 CHAR(200)列,如果在前 10 個或 20 個字元內,多數值是惟一

的,那麼就不要對整個列進行索引。對前10個或20個字元進行索引能夠節省大量索引空間,

也可能會使查詢更快。較小的索引涉及的磁碟 IO 較少,較短的值比較起來更快。更為重要

的是,對於較短的鍵值,索引快取記憶體中的塊能容納更多的鍵值,因此,MySQL 也可以在

記憶體中容納更多的值。這樣就增加了找到行而不用讀取索引中較多塊的可能性。

 4、利用最左字首。在建立一個n列的索引時,實際是建立了MySQL可利用的n個索引。

多列索引可起幾個索引的作用,因為可利用索引中最左邊的列集來匹配行。這樣的列集稱為

最左字首。

 5、不要過度索引。不要以為索引“越多越好”,什麼東西都用索引是錯誤的。每個額

外的索引都要佔用額外的磁碟空間,並降低寫操作的效能。在修改表的內容時,索引必須進

行更新,有時可能需要重構,因此,索引越多,所花的時間越長。如果有一個索引很少利用

或從不使用,那麼會不必要地減緩表的修改速度。此外,MySQL 在生成一個執行計劃時,

要考慮各個索引,這也要花費時間。建立多餘的索引給查詢優化帶來了更多的工作。索引太

多,也可能會使 MySQL 選擇不到所要使用的最好索引。只保持所需的索引有利於查詢優化。

6、 對於 InnoDB 儲存引擎的表,記錄預設會按照一定的順序儲存,如果有明確定義的主

鍵,則按照主鍵順序儲存。如果沒有主鍵,但是有唯一索引,那麼就是按照唯一索引的順序

儲存。如果既沒有主鍵又沒有唯一索引,那麼表中會自動生成一個內部列,按照這個列的順

序儲存。按照主鍵或者內部列進行的訪問是最快的,所以 InnoDB 表儘量自己指定主鍵,當

表中同時有幾個列都是唯一的,都可以作為主鍵的時候,要選擇最常作為訪問條件的列作為

主鍵,提高查詢的效率。另外,還需要注意,InnoDB 表的普通索引都會儲存主鍵的鍵值,

所以主鍵要儘可能選擇較短的資料型別,可以有效地減少索引的磁碟佔用,提高索引的快取

效果。