建立高效能的索引 二

2021-08-22 09:52:05 字數 2530 閱讀 2585

當我們討論索引時,不特殊說明某一類,我們一般說的是b-tree索引(多路平衡查詢樹),使用b-tree的目的是將過多的磁碟io查詢轉換成記憶體查詢。磁碟讀取依靠的是機械運動,分為尋道時間、旋轉延遲、傳輸時間三個部分,這三個部分耗時相加就是一次磁碟io的時間,大概9ms左右。這個成本是訪問記憶體的十萬倍左右;正是由於磁碟io是非常昂貴的操作,所以計算機作業系統對此做了優化:預讀;每一次io時,不僅僅把當前磁碟位址的資料載入到記憶體,同時也把相鄰資料也載入到記憶體緩衝區中。因為區域性預讀原理說明:當訪問乙個位址資料的時候,與其相鄰的資料很快也會被訪問到。每次磁碟io讀取的資料我們稱之為一頁(page)。一頁的大小與作業系統有關,一般為4k或者8k。這也就意味著讀取一頁內資料的時候,實際上發生了一次磁碟io。查詢情況最差的時候就是遍歷二叉樹出從根節點到最高度的葉子節點,假如乙個樹度為10,那麼最差的情況就是二叉樹查詢10次。所以,我們發現二叉樹查詢最大的問題就是度,於是我們可以構造乙個度很低的樹,也就是把高瘦的二叉樹變為矮胖樹。

實現過程就是把多個索引放在乙個節點內部,這樣當我們從磁碟載入乙個節點,那麼我們可以直接可以比較該節點內部的多個索引值,這樣就避免了傳統的二叉樹比較2個節點,需要從磁碟機械運動2次載入資料,而把乙個節點載入到記憶體,通過記憶體間直接比較的效率高於機械運動的查詢。所以矮胖的樹,就是因為乙個節點內部可以裝多個值。

b-tree是有序的進行儲存的,它是可以加快表查詢速度的,因為使用該索引,就不用進行全表掃瞄,而是從樹的根節點開始查詢,根節點存放了下個值的指標,只需要順著指標獲取到真實值,然後進行比較,如果沒找到,則乙個根據下乙個節點進行依次比較。

可以用b-tree進行的查詢的型別:全鍵值,鍵值範圍,鍵字首查詢,而且要遵循鍵的最左查詢。

雜湊索引支援的資料庫儲存引擎是memory,雜湊索引實現過程是,對於每一行資料,memory引擎都會計算出乙個特殊的hash code,雜湊碼是乙個較小的值,且不同的行計算出的雜湊碼不一樣,雜湊索引將所有雜湊碼儲存在索引中,同時雜湊表中存放每個雜湊行的指標,通過計算特定一行的雜湊碼,再將雜湊碼放到索引中查詢就能找到了。

myisan支援空間資料索引,可以用作地理資料儲存。

全文索引是一種特殊的索引,它可以 查詢一篇文章中的關鍵字,而不都是像普通的索引對比索引的值。

還有其他第三方資料庫儲存引擎使用的索引型別,這裡就沒有一一講述完。

索引可以讓伺服器快速定位到表特定的位置,這個並不是索引唯一的功能,索引還具備其他功能,傳統的b-tree索引,是通過順序儲存的,所以除了用來快速查詢還能用來orderby,groupby等功能,綜上索引的功能總結如下:

通常我們可以看到一張表新增了索引,但是這個索引在where查詢時,並不是乙個單獨的列,類似這樣的

select * from students where student_id+1=5
我們可以看到,若是student_id為主鍵索引,但是使用該索引並沒有單獨地使用該列,而是加了乙個表示式什麼的,那麼資料庫不用使用索引的方式進行查詢的。 

什麼是字首索引,字首索引就是,當我們查詢乙個比較長的列,比如是varchar,text等字段時,mysql不允許我們進行全值匹配索引查詢,這個我們就需要進行字首索引查詢,通過查詢列的前半部分,可以提高索引的查詢效率,節約索引空間。怎麼建立乙個字首索引?有2個點決定乙個好的字首索引

越接近全值:越接近全值,並不是說直接等於全值就可以了,而是需要同時選擇性越高和越接近全值2個方面一起才是最優的字首索引。

通過如下例子進行展示如何建立乙個字首索引:

很多人對多列索引的認識不夠,最常見的就是為每個列建立乙個索引,當我們的sql語句使用多個單列索引,效能不見得是做優化的。比如我們的sql語句如下:

select * from student where student_id=5 or class_id=4;
假設student_id 和class_id都是索引,則mysql並不是執行最優查詢。這個時候可以把這2個索引合併為乙個多列索引。

建立乙個多列索引,則在使用多列索引需要遵循最左查詢原則,意思是如果左邊第乙個沒有在where的索引查詢中,那麼多列索引第二個,第三個等等都不會有使用到索引,我們應該把選擇性最高的列放最前面,選擇性最高的意思就是100行資料student裡面,80行中的class_id都是乙個值為5班,60行中subject_id都是乙個值2科,那麼通過subject_id我們可以過濾更多多餘資料。所以應該把subject_id放第一位置。

聚簇索引並不是乙個索引型別,而是索引的一種資料存放方式,

聚簇索引就是把索引和資料放在一塊,而不是像myisan的資料存放方式,聚簇索引的索引檔案和資料檔案是乙個檔案,而myisan的則是2個分開的檔案。

innodb的聚簇索引最好給乙個自增的主鍵id,這樣在儲存上才是順序i/o而不是隨機i/o,隨機i/o需要進行磁碟查詢。

高效能mysql(一) 建立高效能索引

單列索引和多列索引 單列索引 多個單列索引的選擇問題 多個or條件 多個單列的效能往往效能很低,盡量建立高效的多列索引。多列索引 選擇合適的索引順序 避免範圍條件 在where子句中,in是有效的,範圍條件會導致後面的索引無效!在order by中,範圍條件和in都會導致無法按照索引排序!按照索引順...

Mysql建立高效能索引

mysql索引的基礎和型別 索引的基礎 1.索引類似於書籍的目錄,要想找到一本書的某個特定主題,需要先查詢書的目錄,定位對應的頁碼 儲存引擎使用類似的方式進行資料查詢,先去索引當中找到對應的值,然後根據匹配的索引找到對應的資料行 索引對效能的影響 大大減少伺服器需要掃瞄的資料量,比如我們資料表中有一...

mysql建立高效能的索引

mysql索引的基礎和型別 延伸 mysql索引建立的原則 延伸 mysql索引的注意事項 mysql索引的基礎和型別 1 索引對效能的影響 大大的減少了伺服器掃瞄的資料量 幫助伺服器避免排序和臨時表 將隨機i o變成順序i o 大大提高了查詢的速度,降低了寫的速度,占用磁碟。2 索引的型別 索引有...