索引是什么嗓违?
MySQL官方對索引的定義為:索引是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu);
索引是提高查詢速度的最重要的工具社证,雖然還有一些其他技術(shù)能提升性能警医,但一般來說引起最大性能差異的,都是索引的正確使用典徘,所以應(yīng)該首先從索引的角度來提升性能蟀苛;
MySQL索引類型
普通索引(INDEX),最基本的索引逮诲,沒有任何限制帜平;
唯一索引(UNIQUE)幽告,值必須是唯一,但允許空裆甩;
主鍵索引(PRIMARY KEY)冗锁,是一種特殊的唯一索引,不允許有空值嗤栓;
全文索引(FULLTEXT)冻河,僅可用于MyISAM,檢索文本信息用抛腕,針對較大的數(shù)據(jù)芋绸,生成時耗時耗空間;
單列索引:一個索引只包含一個列担敌,注意摔敛,多個單列索引之間沒有任何關(guān)系;
多列索引(組合索引):一個索引包含多各列全封,尤其需要注意的是創(chuàng)建組合索引時各列的順序马昙;
MySQL索引方法——BTree
BTree索引:MySQL數(shù)據(jù)庫中使用最頻繁的索引類型,基本所有存儲引擎都支持BTree索引刹悴,下圖分別是MyISAM和InnoDB存儲引擎的BTree索引行楞。
MySQL索引方法——Hash
Hash索引:主要通過Hash算法(常見的Hash算法有直接定址法、平方取中法土匀、折疊法子房、除數(shù)取余法、隨機(jī)數(shù)法)就轧,將數(shù)據(jù)庫字段數(shù)據(jù)轉(zhuǎn)換成定長的Hash值证杭,與這條數(shù)據(jù)的行指針一并存入Hash表的對應(yīng)位置;如果發(fā)生Hash碰撞(兩個不同關(guān)鍵字的Hash值相同)妒御,則在對應(yīng)Hash鍵下以鏈表形式存儲解愤。
檢索算法:在檢索查詢時,就再次對待查關(guān)鍵字再次執(zhí)行相同的Hash算法乎莉,得到Hash值送讲,到對應(yīng)Hash表對應(yīng)位置取出數(shù)據(jù)即可,如果發(fā)生Hash碰撞惋啃,則需要在取值時進(jìn)行篩選哼鬓。目前使用Hash索引的數(shù)據(jù)庫并不多,主要有Memory等肥橙。
一般來說魄宏,索引的檢索效率非常高,可以一次定位存筏,不像B-Tree索引需要進(jìn)行從根節(jié)點到葉節(jié)點的多次IO操作宠互。有利必有弊,Hash算法在索引的應(yīng)用也有很多弊端椭坚,例如:
a予跌、Hash索引僅僅能滿足等值的查詢,范圍查詢不保證結(jié)果正確善茎。因為數(shù)據(jù)在經(jīng)過Hash算法后券册,其大小關(guān)系就可能發(fā)生變化。
b垂涯、Hash索引不能被排序烁焙。同樣是因為數(shù)據(jù)經(jīng)過Hash算法后,大小關(guān)系就可能發(fā)生變化耕赘,排序是沒有意義的骄蝇。
c、Hash索引不能避免表數(shù)據(jù)的掃描操骡。因為發(fā)生Hash碰撞時九火,僅僅比較Hash值是不夠的,需要比較實際的值以判定是否符合要求册招。
d岔激、Hash索引在發(fā)生大量Hash值相同的情況時性能不一定比B-Tree索引高。因為碰撞情況會導(dǎo)致多次的表數(shù)據(jù)的掃描是掰,造成整體性能的低下虑鼎,可以通過采用合適的Hash算法一定程度解決這個問題。
e键痛、Hash索引不能使用部分索引鍵查詢炫彩。因為當(dāng)使用組合索引情況時,是把多個數(shù)據(jù)庫列數(shù)據(jù)合并后再計算Hash值散休,所以對單獨列數(shù)據(jù)計算Hash值是沒有意義的媒楼。
索引的優(yōu)缺點
索引的優(yōu)點是可以提高檢索數(shù)據(jù)的速度,這是創(chuàng)建索引的最主要的原因戚丸;對于有依賴關(guān)系的子表和父表之間的聯(lián)合查詢時划址,可以顯著提高查詢速度;使用分組和排序子句進(jìn)行數(shù)據(jù)查詢時限府,同樣可以顯著節(jié)省查詢中分組和排序的時間夺颤。
索引的缺點是創(chuàng)建和維護(hù)索引需要耗費時間,耗費時間的數(shù)量隨著數(shù)據(jù)量的增加而增加胁勺;每一個索引要占一定的物理空間世澜;增加、刪除和修改數(shù)據(jù)時署穗,要動態(tài)的維護(hù)索引寥裂,造成數(shù)據(jù)的維護(hù)速度降低了嵌洼。
各種索引的適用場景
索引的本質(zhì):以空間換時間,以插入更新速度降低換取查詢檢索速度的提升封恰。
主鍵索引/唯一索引:以更快的速度精準(zhǔn)的定位到某條數(shù)數(shù)據(jù)麻养,適用于絕大多數(shù)需要更新和查詢的表(只會插入數(shù)據(jù)的表除外),絕對用不到范圍查詢的可以使用Hash索引诺舔;
普通索引/組合索引:表的關(guān)聯(lián)鳖昌、查詢,適用于查詢需求較多的表低飒,對經(jīng)常插入和更新的表要適當(dāng)降低組合索引的使用许昨;
全文索引:全文檢索使用,但如果有的選擇褥赊,盡量不用數(shù)據(jù)庫自己的全文索引糕档。
Hash索引:主鍵,MD5碼等需要唯一確定一條數(shù)據(jù)的等值查詢崭倘,需要范圍查詢的不能使用Hash索引翼岁;