????????了解過(guò)MYSQL數(shù)據(jù)庫(kù)的人琳要,都知道索引能提高查詢效率寡具。那么為什么索引能提高查詢效率?小編將自己的一些看法分享給大家稚补。
1.什么是索引童叠?
? ????? 索引的本質(zhì)是一種數(shù)據(jù)結(jié)構(gòu)。(B+樹(shù))我們都知道索引是建立在數(shù)據(jù)表的某一列上课幕,具有索引列上的值的數(shù)據(jù)都會(huì)存儲(chǔ)在數(shù)據(jù)結(jié)構(gòu)中厦坛。
2.索引的重要性。
? ? ? ? 索引就好比一本書的目錄撰豺,通過(guò)目錄就可以快速的找到自己所需要的某一頁(yè)粪般。設(shè)想一下要是沒(méi)有目錄,那么我們就要一頁(yè)一頁(yè)進(jìn)行查找污桦,如果我們所需要的是這本書的最后一頁(yè)亩歹,那么就太費(fèi)時(shí)了。我們都知道MYSQL數(shù)據(jù)庫(kù)中的數(shù)據(jù)都是存放在磁盤中凡橱,增添了索引就能大大的減少對(duì)磁盤的訪問(wèn)小作,提高了查詢效率。
3.索引的底層到底是什么稼钩?
? ? 在MYSQL中不同的存儲(chǔ)殷勤索引底層的實(shí)現(xiàn)是不一樣的顾稀。
? ? ? ? MYISAM存儲(chǔ)殷勤底層的數(shù)據(jù)結(jié)構(gòu)為為B+樹(shù),該樹(shù)的結(jié)構(gòu)下圖如圖所示坝撑,
例如:我們要查詢Select stuName form student where stuId = 1静秆。先查看MYI文件(B+樹(shù)的數(shù)據(jù)結(jié)構(gòu)在MYI文件)查看stuID 是否有索引如果有就會(huì)查找索引樹(shù)? 通過(guò)data找到地址對(duì)應(yīng)MYD(數(shù)據(jù)庫(kù)中數(shù)據(jù)表的數(shù)據(jù)在MYD文件中)的文件位置將結(jié)果值返回給我們粮揉。MYISAM存儲(chǔ)殷勤的索引也成為非聚集索引。
INNODB存儲(chǔ)殷勤的底層數(shù)據(jù)結(jié)構(gòu)是B+樹(shù)抚笔,結(jié)構(gòu)如下圖所示所示扶认,
INNODB的存儲(chǔ)殷勤的葉子節(jié)點(diǎn)攜帶了數(shù)據(jù),該存儲(chǔ)殷勤的索引也稱聚集索引殊橙。
4.是不是索引越多越好辐宾?
? ? ? ? ?1.當(dāng)數(shù)據(jù)量比較少時(shí),不適合用索引膨蛮。例如叠纹,當(dāng)一本書的內(nèi)容只有2頁(yè)時(shí),目錄就有5頁(yè)敞葛,這是? ? ? 得不償失的誉察。
? ? ? ? ? 2.索引雖然提高查詢的效率,但是在insert惹谐,updata冒窍,delect降低了更新表的速度。
5.什么情況下不適合建立索引豺鼻?
? ? ? ? 1.在查詢過(guò)程中很少用到的查詢列综液。
????????2.表記錄太少。
? ? ? ? 3.經(jīng)常増刪改的表儒飒。
? ? ? ? 4.某個(gè)數(shù)據(jù)列包含許多重復(fù)的內(nèi)容谬莹。
6.索引在什么情況下失效?
? ? ? ? 1.全字匹配我最愛(ài)?
? ? ? ? ?例如:一個(gè)學(xué)生表的某一個(gè)索引由stuName,stuAge,stuPos這三列組成桩了,sql語(yǔ)句為 select *? ? from student where stuName='張三',stuAge='12' and stuPost=12; 如果where條件后面的屬性的順序和建立索引時(shí)屬性的順序不同那么索引失效附帽。
? ? ? ?2. 最佳左前綴法則
? ? ? ? 例如:索引是由這stuName,stuAge,stuPos三列組成那么查詢語(yǔ)句。查詢語(yǔ)句為select stuName,stuAge,stuPos foem student 不會(huì)發(fā)生索引井誉。如果查詢條件為select stuAge,stuPos foem student 會(huì)發(fā)生索引蕉扮。
? ? ????3.在索引列上做(計(jì)算,函數(shù)颗圣,類型裝換)操作會(huì)導(dǎo)致索引失效喳钟。
????????例如:select * from student where left(name,1) = '張';
? ? ? ?4.mysql在使用!= 或者 <> 時(shí)索引失效在岂。
? ? ? ? 5.在使用is null? 或者 not is null 也會(huì)導(dǎo)致索引失效奔则。
? ? ? ? 6.在使用kike%abc會(huì)導(dǎo)致所以失效,kikeabc%不會(huì)導(dǎo)致索引失效蔽午。
? ? ? ? 7.數(shù)字字符串不加單引號(hào)會(huì)導(dǎo)致索引失效算途。
? ? ? ? 8.使用or鏈接詞會(huì)導(dǎo)致索引失效翘贮。
這些就是小編的一些看法净神。不足之處希望大家能指出來(lái)。