概述
索引用于快速找出在某個(gè)列中有一特定值的行。不使用索引,MySQL必須從第1條記錄開始然后讀完整個(gè)表直到找出相關(guān)的行炊林。表越大,花費(fèi)的時(shí)間越多卷要。如果表中查詢的列有一個(gè)索引渣聚,MySQL能快速到達(dá)一個(gè)位置去搜尋到數(shù)據(jù)文件的中間独榴,沒有必要看所有數(shù)據(jù)。
??在MySQL中所有的類型數(shù)據(jù)列都可以被索引奕枝,對(duì)相關(guān)列使用索引是提高select操作性能的最佳途徑棺榔。MyISAM和InnoDB存儲(chǔ)引擎的表默認(rèn)創(chuàng)建索引都是BTREE索引。MyISAM還支持全文本索引隘道,該索引可以用于創(chuàng)建全文搜索症歇。默認(rèn)情況下, MEMORY存儲(chǔ)引擎使用HASH索引谭梗,但也支持BTREE索引忘晤。
設(shè)計(jì)索引原則
- 最合適索引的列是出現(xiàn)在where子句中的列,或者連接子句中的列激捏。
- 使用唯一索引设塔,索引的列的基數(shù)越大,索引效果越好远舅,如存放生日的列具有不同的值闰蛔,很容易區(qū)分各個(gè)行,而記錄性別的列表谊,只含有“m”和“f”钞护,則對(duì)此列進(jìn)行索引沒有多大用處盖喷,因?yàn)椴还芩阉髂膫€(gè)值爆办,都會(huì)大約得出一半的行。
- 使用前綴索引课梳,如果對(duì)一個(gè)字符串列進(jìn)行索引距辆,應(yīng)該指定一個(gè)前綴長(zhǎng)度。
- 如果索引了多列(復(fù)合索引)暮刃,要遵守最左前綴法則跨算。所謂最左前列,指的是查詢從索引的最左前列開始椭懊,并且不跳過索引中的列诸蚕。
- 不要過多的使用索引。每一次的更新氧猬,刪除背犯,插入都會(huì)維護(hù)該表的索引;更多的索引意味著也需要更多的空間 盅抚;過小的表漠魏,建索引可能會(huì)更慢哦 :) (讀個(gè)2頁(yè)的宣傳手冊(cè),你還先去找目錄妄均?)柱锹。
- 對(duì)InnoDB存儲(chǔ)引擎的表哪自,記錄默認(rèn)會(huì)按照一定的順序保存,如果有明確定義的主鍵禁熏,則按照主鍵順序保存壤巷,InnoDB表的普通索引都會(huì)保存主鍵的鍵值,所有主鍵盡可能的選擇較短的數(shù)據(jù)類型瞧毙。
- 索引列不應(yīng)該作為表達(dá)式的一部分隙笆,即也不能在索引列上使用函數(shù)。
說明:
創(chuàng)建表(friends)與創(chuàng)建(uid和fuid的復(fù)合索引)升筏。
friends表結(jié)構(gòu)
-
對(duì)第4條說明:
最左前綴法則
第2條語句,從索引的第二列開始查找撑柔,使用索引失敗,導(dǎo)致MySQL采用ALL訪問策略您访,即全表查詢.在開發(fā)中铅忿,應(yīng)該盡量避免全表查詢。
-
對(duì)第7條說明:
索引不能使用表達(dá)式或函數(shù)
第2和3條語句都有使用表達(dá)式灵汪,索引派不上用場(chǎng)檀训。
參考
參考1:http://thephper.com/?p=142
參考2:http://my.oschina.net/longniao/blog/110384