ps:沒有特殊說明,此隨筆中默認(rèn)采用innoDB存儲引擎中的索引,且索引都是指B+樹(多路平衡搜索樹)結(jié)構(gòu)組織的索引 。其中聚集索引、復(fù)合索引、前綴索引、唯一索引默認(rèn)都是使用B+樹,統(tǒng)稱為索引 。
索引概述索引是存儲引擎用于快速找到記錄的一種數(shù)據(jù)結(jié)構(gòu) 。
如下圖所示:

文章插圖
圖中左邊是數(shù)據(jù)表,一共有2列7行數(shù)據(jù),最左邊的0x09格式的數(shù)據(jù)是物理地址(注:邏輯上相鄰的記錄在磁盤上也不一定是物理相鄰的) 。為了加快Col2列數(shù)據(jù)的查找,可以維護(hù)一個右邊所示的二叉查找樹,每個節(jié)點分別包含索引鍵值和一個指向?qū)?yīng)數(shù)據(jù)的物理地址的指針,這樣就可以使用二叉查找樹來快速獲取到對應(yīng)的數(shù)據(jù) 。
要理解MySQL中索引是如何工作的,最簡單的方法就是去看看一本書的“索引”部分:如果想在一本書中找到某個特定主題,一般會先看書的“索引”,找到對應(yīng)的頁碼 。索引對于良好的性能非常關(guān)鍵 。尤其是當(dāng)表中的數(shù)據(jù)越來越大時,索引對性能影響愈發(fā)重要 。在數(shù)據(jù)量較小且負(fù)載較低時,不恰當(dāng)?shù)乃饕龑π阅艿挠绊懣赡苓€不明顯,但當(dāng)數(shù)據(jù)量逐漸增大時,性能則會急劇下降 。
一般來說索引本身占用也較大,不可能將全部索引存儲在內(nèi)存中,因此索引往往以索引文件(注:存儲引擎是MYISAM時,索引單獨存儲在.myi文件中;存儲引擎是InnoDB時,索引和表數(shù)據(jù)一起存儲在.ibd文件中)的形式存儲在磁盤上 。索引是數(shù)據(jù)庫中用來提高性能的最常用的工具 。
為什么需要索引不使用索引,MySQL 就必須從第一條記錄開始讀完整個表,直到找出相關(guān)的行 。表越大,查詢數(shù)據(jù)所花費的時間就越多 。如果表中查詢的列有一個索引,MySQL 就能快速到達(dá)一個位置去搜索數(shù)據(jù)文件,而不必查看所有數(shù)據(jù),這樣將會節(jié)省很大一部分時間 。
建立索引的優(yōu)勢與劣勢優(yōu)勢
- 類似于書籍的目錄索引,提高數(shù)檢索的效率,降低數(shù)據(jù)庫的IO成本 。
- 在實現(xiàn)數(shù)據(jù)的參考完整性方面可以加速表與表之間的連接 。
- 在使用分組和排序進(jìn)行檢索的時候,可以減少查詢中分組和排序的時間.
- 實際上索引也是一張表,該表中保存了主鍵和索引字段,并指向?qū)嶓w類的記錄,因此需要占用物理空間 。數(shù)據(jù)量越大,占用空間就越大 。
- 創(chuàng)建和維護(hù)索引都需要耗費時間,這種時間隨著數(shù)據(jù)量的增加而增加 。
- 雖然創(chuàng)建索引大大提高了查詢的效率,同時卻也降低了更新表的速度,例如對表進(jìn)行insert、update、delete等操作 。因為更新表時,MySQL不僅要保存數(shù)據(jù),還需要保存索引文件每次更新的索引列的字段,動態(tài)調(diào)整因為更新所帶來的鍵值變化后的索引信息 。
二叉查找樹的引入首先,我們來看二叉查找樹 。
二叉查找樹有這樣的特點:
普通二叉查找樹如下圖所示:
- 若它的左子樹不空,則左子樹上所有結(jié)點的值均小于它的根結(jié)點的值;
- 若它的右子樹不空,則右子樹上所有結(jié)點的值均大于它的根結(jié)點的值;
- 它的左、右子樹也分別為二叉查找樹 。

文章插圖
二叉查找樹如果是完全二叉樹,查找的效率很高,時間復(fù)雜度為O(log2N) 。因為最多只需要查找到樹的log2N深度層 。
但是當(dāng)二叉查找樹為單支樹時,其退化為鏈表,此時它的深度為N,時間復(fù)雜度為O(N) 。
經(jīng)驗總結(jié)擴(kuò)展閱讀
- 關(guān)于學(xué)習(xí)和安靜的格言
- 基礎(chǔ)&進(jìn)階 線段樹學(xué)習(xí)筆記(一) | P3372 【模板】線段樹 1 題解
- 下 MySQL數(shù)據(jù)庫-數(shù)據(jù)表
- Mysql 數(shù)據(jù)庫SQL腳本導(dǎo)入
- Docker MySql 查看版本的三種方法
- 一百一十九 salesforce零基礎(chǔ)學(xué)習(xí)In-App Guidance實現(xiàn)引導(dǎo)頁操作功能
- .NET源碼學(xué)習(xí) [算法2-數(shù)組與字符串的查找與匹配]
- 如何開展學(xué)習(xí)十八大,提高了教育的質(zhì)量
- 十歲小孩學(xué)習(xí)不太好跟家長又不會怎么教他呢
- 高效上課學(xué)習(xí)方法
