什么是索引?為什么要建立索引
索引用于快速找出在某個列中有一特定值的行唇聘,不使用索引MySQL必須從第一條記錄開始讀完整個表楔绞,直到找出相關(guān)的行慎菲,表越大查詢數(shù)據(jù)所花費的時間就越多,如果表中查詢的列有一個索引,MySQL能夠快速到達一個位置去搜索數(shù)據(jù)文件厦坛,而不必查看所有數(shù)據(jù)五垮,那么將會節(jié)省很大一部分時間。
例如:有一張person表杜秸,其中有2W條記錄放仗,記錄著2W個人的信息。有一個Phone的字段記錄每個人的電話號碼撬碟,現(xiàn)在想要查詢出電話號碼為xxxx的人的信息诞挨。
如果沒有索引,那么將從表中第一條記錄一條條往下遍歷呢蛤,直到找到該條信息為止惶傻。
如果有了索引,那么會將該Phone字段其障,通過一定的方法進行存儲银室,好讓查詢該字段上的信息時,能夠快速找到對應的數(shù)據(jù)静秆,而不必在遍歷2W條數(shù)據(jù)了粮揉。其中MySQL中的索引的存儲類型有兩種:BTREE、HASH抚笔。 也就是用樹或者Hash值來存儲該字段扶认,要知道其中詳細是如何查找的,需要一定的算法知識了殊橙。
B-Tree
B-Tree索引辐宾,它是目前關(guān)系型數(shù)據(jù)庫中查找數(shù)據(jù)最為常用和有效的索引,大多數(shù)存儲引擎都支持這種索引膨蛮。使用B-Tree這個術(shù)語叠纹,是因為MySQL在CREATE TABLE或其它語句中使用了這個關(guān)鍵字,但實際上不同的存儲引擎可能使用不同的數(shù)據(jù)結(jié)構(gòu)敞葛,比如InnoDB就是使用的B+Tree誉察。
B+Tree中的B是指balance,意為平衡惹谐。需要注意的是持偏,B+樹索引并不能找到一個給定鍵值的具體行,它找到的只是被查找數(shù)據(jù)行所在的頁氨肌,接著數(shù)據(jù)庫會把頁讀入到內(nèi)存鸿秆,再在內(nèi)存中進行查找,最后得到要查找的數(shù)據(jù)怎囚。
InnoDB聚簇索引(clustered index)
聚簇索引保證關(guān)鍵字的值相近的元組存儲的物理位置也相同(所以字符串類型不宜建立聚簇索引卿叽,特別是隨機字符串,會使得系統(tǒng)進行大量的移動操作),且一個表只能有一個聚簇索引考婴。因為由存儲引擎實現(xiàn)索引贩虾,所以,并不是所有的引擎都支持聚簇索引蕉扮。
聚簇索引:
二級索引:
索引的優(yōu)點和缺點
優(yōu)點
1整胃、所有的MySql列類型(字段類型)都可以被索引,也就是可以給任意字段設置索引
2喳钟、大大加快數(shù)據(jù)的查詢速度
缺點
1、創(chuàng)建索引和維護索引要耗費時間在岂,并且隨著數(shù)據(jù)量的增加所耗費的時間也會增加
2奔则、索引也需要占空間,我們知道數(shù)據(jù)表中的數(shù)據(jù)也會有最大上線設置的蔽午,如果我們有大量的索引易茬,索引文件可能會比數(shù)據(jù)文件更快達到上線值
3、當對表中的數(shù)據(jù)進行增加及老、刪除抽莱、修改時,索引也需要動態(tài)的維護骄恶,降低了數(shù)據(jù)的維護速度食铐。
使用原則
通過上面說的優(yōu)點和缺點,我們應該可以知道僧鲁,并不是每個字段度設置索引就好虐呻,也不是索引越多越好,而是需要自己合理的使用寞秃。
并不是所有索引對查詢都有效
并不是所有索引對查詢都有效斟叼,SQL是根據(jù)表中數(shù)據(jù)來進行查詢優(yōu)化的,當索引列有大量數(shù)據(jù)重復時春寿,SQL查詢可能不會去利用索引朗涩,如一表中有字段 sex,male绑改、female幾乎各一半谢床,那么即使在sex上建了索引也對查詢效率起不了作用。
索引并不是越多越好
索引固然可以提高相應的 select 的效率绢淀,但同時也降低了 insert 及 update 的效率萤悴,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮皆的,視具體情況而定覆履。一個表的索引數(shù)較好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有必要。
避免更新聚簇索引數(shù)據(jù)列
應盡可能的避免更新 clustered 索引數(shù)據(jù)列硝全,mysql默認的clustered索引為主鍵栖雾,因為 clustered 索引數(shù)據(jù)列的順序就是表記錄的物理存儲順序,一旦該列值改變將導致整個表記錄的順序的調(diào)整伟众,會耗費相當大的資源析藕。若應用系統(tǒng)需要頻繁更新 clustered 索引數(shù)據(jù)列,那么需要考慮是否應將該索引建為 clustered 索引凳厢。
經(jīng)常更新的表就避免對其進行過多的索引
對經(jīng)常更新的表就避免對其進行過多的索引账胧,對經(jīng)常用于查詢的字段應該創(chuàng)建索引。
數(shù)據(jù)量小的表最好不要使用索引
數(shù)據(jù)量小的表最好不要使用索引先紫,因為由于數(shù)據(jù)較少治泥,可能查詢?nèi)繑?shù)據(jù)花費的時間比遍歷索引的時間還要短,索引就可能不會產(chǎn)生優(yōu)化效果遮精。
避免在不同值少的列上加索引
在一不同值少的列上(字段上)不要建立索引居夹,比如在學生表的"性別"字段上只有男,女兩個不同值本冲。相反的准脂,在一個字段上不同值較多可以根據(jù)需要建立索引。
根據(jù)業(yè)務需求建立索引
索引的建立要根據(jù)業(yè)務特點進行檬洞,不能憑空想象的設置索引狸膏。經(jīng)常作為查詢條件的列才有建立索引的必要性。
上一篇 | 《性能優(yōu)化系列文章目錄》 | 下一篇 |
---|