(007)mysql索引的設(shè)計和使用

概述

索引用于快速找出在某個列中有一特定值的行。不使用索引,MySQL必須從第1條記錄開始然后讀完整個表直到找出相關(guān)的行。表越大,花費的時間越多。如果表中查詢的列有一個索引,MySQL能快速到達一個位置去搜尋到數(shù)據(jù)文件的中間,沒有必要看所有數(shù)據(jù)。
??在MySQL中所有的類型數(shù)據(jù)列都可以被索引,對相關(guān)列使用索引是提高select操作性能的最佳途徑。MyISAM和InnoDB存儲引擎的表默認創(chuàng)建索引都是BTREE索引。MyISAM還支持全文本索引,該索引可以用于創(chuàng)建全文搜索。默認情況下, MEMORY存儲引擎使用HASH索引,但也支持BTREE索引。

設(shè)計索引原則

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

說明:

創(chuàng)建表(friends)與創(chuàng)建(uid和fuid的復(fù)合索引)。


friends表結(jié)構(gòu)
  • 對第4條說明:


    最左前綴法則

    第2條語句,從索引的第二列開始查找,使用索引失敗,導(dǎo)致MySQL采用ALL訪問策略,即全表查詢.在開發(fā)中,應(yīng)該盡量避免全表查詢。

  • 對第7條說明:


    索引不能使用表達式或函數(shù)

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

參考

參考1:http://thephper.com/?p=142
參考2:http://my.oschina.net/longniao/blog/110384

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容