(7)mysql 索引的設計和使用

林灣村龍貓發表於2017-01-18

概述

  索引用於快速找出在某個列中有一特定值的行。不使用索引,MySQL必須從第1條記錄開始然後讀完整個表直到找出相關的行。表越大,花費的時間越多。如果表中查詢的列有一個索引,MySQL能快速到達一個位置去搜尋到資料檔案的中間,沒有必要看所有資料。
  在MySQL中所有的型別資料列都可以被索引,對相關列使用索引是提高select操作效能的最佳途徑。MyISAM和InnoDB儲存引擎的表預設建立索引都是BTREE索引。MyISAM還支援全文字索引,該索引可以用於建立全文搜尋。預設情況下, MEMORY儲存引擎使用HASH索引,但也支援BTREE索引。

設計索引原則

  1. 最合適索引的列是出現在where子句中的列,或者連線子句中的列。
  2. 使用唯一索引,索引的列的基數越大,索引效果越好,如存放生日的列具有不同的值,很容易區分各個行,而記錄性別的列,只含有“m”和“f”,則對此列進行索引沒有多大用處,因為不管搜尋哪個值,都會大約得出一半的行。
  3. 使用字首索引,如果對一個字串列進行索引,應該指定一個字首長度。
  4. 如果索引了多列(複合索引),要遵守最左字首法則。所謂最左前列,指的是查詢從索引的最左前列開始,並且不跳過索引中的列。
  5. 不要過多的使用索引。每一次的更新,刪除,插入都會維護該表的索引;更多的索引意味著也需要更多的空間 ;過小的表,建索引可能會更慢哦 :) (讀個2頁的宣傳手冊,你還先去找目錄?)。
  6. 對InnoDB儲存引擎的表,記錄預設會按照一定的順序儲存,如果有明確定義的主鍵,則按照主鍵順序儲存,InnoDB表的普通索引都會儲存主鍵的鍵值,所有主鍵儘可能的選擇較短的資料型別。
  7. 索引列不應該作為表示式的一部分,即也不能在索引列上使用函式。

說明:

建立表(friends)與建立(uid和fuid的複合索引)。

(7)mysql 索引的設計和使用
friends表結構

  • 對第4條說明:
    (7)mysql 索引的設計和使用
    最左字首法則

    第2條語句,從索引的第二列開始查詢,使用索引失敗,導致MySQL採用ALL訪問策略,即全表查詢.在開發中,應該儘量避免全表查詢。
  • 對第7條說明:
    (7)mysql 索引的設計和使用
    索引不能使用表示式或函式

    第2和3條語句都有使用表示式,索引派不上用場。

參考

參考1:thephper.com/?p=142
參考2:my.oschina.net/longniao/bl…

相關文章