2.MySQL中的索引
索引就像樹(shù)的目錄,是為了更快的找到所要找的內(nèi)容(數(shù)據(jù))。MySQL中,索引是在存儲(chǔ)引擎層實(shí)現(xiàn)的,不同的存儲(chǔ)引擎有不同的索引模型,如innodb是采用的是B+樹(shù)的索引模型,本篇主要以innodb存儲(chǔ)引擎的索引模型來(lái)講解索引知識(shí)。
1.innodb存儲(chǔ)引擎的索引模型
在innodb中,表都是根據(jù)主鍵順序以索引的形式存放的,這種存儲(chǔ)方式的表稱(chēng)為索引組織表,而innodb的索引模型是B+樹(shù),所以數(shù)據(jù)都存儲(chǔ)在B+樹(shù)上。
每一個(gè)索引在innodb里面都對(duì)應(yīng)一顆B+樹(shù),根據(jù)樹(shù)的葉子節(jié)點(diǎn)的不同,索引分為主鍵索引(存的是整行數(shù)據(jù))和非主鍵索引(葉子節(jié)點(diǎn)為主鍵),其中主鍵索引又稱(chēng)為聚簇索引,非主鍵索引稱(chēng)為二級(jí)索引。
主鍵的長(zhǎng)度越小,普通索引的葉子節(jié)點(diǎn)所占的空間就越少,從這個(gè)角度來(lái)說(shuō)用自增主鍵對(duì)索引維護(hù)的代價(jià)要小很多。那在什么業(yè)務(wù)場(chǎng)景下可以用業(yè)務(wù)字段做索引呢,如下場(chǎng)景:
a. 只有一個(gè)索引 ;b. 這個(gè)索引必須是唯一索引。這樣就不用考慮其他索引的葉子節(jié)點(diǎn)的大小問(wèn)題。
2. 覆蓋索引
mysql> create table T ( ID int primary key, k int NOT NULL DEFAULT 0, s varchar(16) NOT NULL DEFAULT '', index k(k)) engine=InnoDB;insert into T values(100,1, 'aa'),(200,2,'bb'),(300,3,'cc'),(500,5,'ee'),(600,6,'ff'),(700,7,'gg');當(dāng)執(zhí)行查詢語(yǔ)句 select * from T where k between (3,5);時(shí)mysql會(huì)先在 k 索引樹(shù)上查找滿足3 到 5 范圍內(nèi)葉子節(jié)點(diǎn)(即主鍵ID 100、500),然后到主鍵索引樹(shù)上查找滿足條件的行,這個(gè)查找過(guò)程稱(chēng)為回表。
如果執(zhí)行查詢語(yǔ)句 select ID from T where k between (3,5);時(shí),則在 k 索引樹(shù)上即可查到滿足條件的ID的值,而避免了回表,這種通過(guò)索引查詢條件的結(jié)果即可“覆蓋”查詢需求稱(chēng)為覆蓋索引,可見(jiàn)覆蓋索引也是優(yōu)化sql的一種很好的手段。
3.最左前綴原則
索引的維護(hù)也是需要成本的,因?yàn)橛凶钭笄熬Y原則,當(dāng)建立一個(gè)聯(lián)合索引(name,age)時(shí),一般就不用單獨(dú)建立name索引了。
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/quxiangxiangtiange/p/11016338.html
總結(jié)
以上是生活随笔為你收集整理的2.MySQL中的索引的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Sublime Text 3安装GoSu
- 下一篇: spark 监控--WebUi、Metr