日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

如何正確的使用索引 mysql索引怎么實(shí)現(xiàn)

學(xué)習(xí)索引主要是為了寫更快的sql 。我們寫sql的時候,需要清楚的知道sql為什么要帶索引 。為什么有些sql不帶索引?Sql將遍歷這些索引 。為什么?我們需要了解它的原理和內(nèi)部具體流程,這樣才能更方便地使用它,寫出更高效的sql 。在本文中,我們只是了解這些問題 。

在閱讀這篇文章之前,你需要知道一些事情:
什么是索引?mysql索引原理詳解mysql索引管理詳解如果你還沒有看過以上三篇文章,那你最好讀一讀,否則下面的內(nèi)容就很難理解了 。
我們先來復(fù)習(xí)一些知識 。
在本文中,我們以innodb存儲引擎為例來說明 。
mysql使用B樹存儲索引信息 。
B樹結(jié)構(gòu)如下:

如何正確的使用索引 mysql索引怎么實(shí)現(xiàn)


說說B樹的一些特點(diǎn):
葉子節(jié)點(diǎn)(最底層)存儲關(guān)鍵字(索引字段的值)信息和對應(yīng)的數(shù)據(jù),葉子節(jié)點(diǎn)存儲所有記錄的關(guān)鍵字信息 。
其他非葉節(jié)點(diǎn)只存儲子節(jié)點(diǎn)的關(guān)鍵字信息和指針 。
每個葉子節(jié)點(diǎn)相當(dāng)于mysql中的一個頁面,同一級別的葉子節(jié)點(diǎn)以鏈表的形式連接 。
每個節(jié)點(diǎn)(頁面)中存儲多條記錄,記錄以單鏈表的形式連接起來形成有序鏈表,按照索引字段排序 。
在B樹中檢索數(shù)據(jù)時:每次檢索都是從根節(jié)點(diǎn)開始,總是需要樹葉 。
InnoDB的數(shù)據(jù)是以數(shù)據(jù)頁為單位讀寫的 。也就是說,當(dāng)需要讀取一條記錄時,并不是從磁盤中讀取記錄本身,而是以頁為單位將整條記錄加載到內(nèi)存中 。一頁中可能有多條記錄,然后在內(nèi)存中搜索該頁 。在innodb中,默認(rèn)情況下每頁的大小是16kb 。
MySQL中的索引分為
聚集索引(主鍵索引)
每個表都必須有一個聚集索引,整個表的數(shù)據(jù)存儲以B樹的形式存儲在一個文件中,以B葉的子節(jié)點(diǎn)中的鍵作為主鍵值,數(shù)據(jù)作為完整的記錄信息;非葉節(jié)點(diǎn)存儲主鍵的值 。
通過聚簇索引檢索數(shù)據(jù),只需要按照B樹的搜索過程,即可以檢索到對應(yīng)的記錄 。
非聚集索引
每個表可以有多個非聚集索引,采用B樹結(jié)構(gòu),其中葉節(jié)點(diǎn)的鍵是索引字段的值,數(shù)據(jù)是主鍵的值;非葉節(jié)點(diǎn)只存儲索引字段的值 。
通過非聚集索引檢索記錄時,需要兩次操作,首先從非聚集索引中檢索主鍵,然后從聚集索引中檢索主鍵對應(yīng)的記錄,這比聚集索引多了一次操作 。
怎么索引?為什么有些查詢沒有索引?為什么不用函數(shù)來索引數(shù)據(jù)呢?
這些問題可以先放一放 。我們來看B樹檢索數(shù)據(jù)的過程,屬于原理部分 。了解了B樹的各種數(shù)據(jù)檢索流程后,就可以理解上述問題了 。
這個查詢被索引通常是什么意思?
當(dāng)我們檢索一個字段的值時,如果能夠快速定位到目標(biāo)數(shù)據(jù)所在的頁面,有效減少頁面的io操作,而不需要掃描所有的數(shù)據(jù)頁面,我們認(rèn)為這種情況可以有效地使用索引,也就是所謂的索引 。如果在此過程中無法確定這些頁面中的數(shù)據(jù),我們認(rèn)為該索引對于此查詢是無效的 。
B樹中的數(shù)據(jù)檢索過程
唯一記錄檢索
如何正確的使用索引 mysql索引怎么實(shí)現(xiàn)


如上圖,所有數(shù)據(jù)都是唯一的 。查詢105記錄的過程如下:
將P1頁加載到內(nèi)存在內(nèi)存中采用二分法查找,可以確定105位于[100,150)中間,所以我們需要去加載100關(guān)聯(lián)P4頁將P4加載到內(nèi)存中,采用二分法找到105的記錄后退出查詢一個值的所有記錄 。
如何正確的使用索引 mysql索引怎么實(shí)現(xiàn)


如上圖,查詢105所有記錄的過程如下:

推薦閱讀