MySQL普通索引與唯一索引

2021-10-05 03:55:44 字數 1243 閱讀 9324

總結參考文獻

當我們需要在乙個唯一欄位上建立索引時,究竟是建立普通索引還是唯一索引的效能更好呢?這時需要從兩個角度考慮

對於普通索引來說,查詢到滿足條件的第乙個記錄後,需要查詢下乙個記錄,直到碰到第乙個不滿足條件的記錄。

對於唯一索引來說,由於索引定義了唯一性,查詢到第乙個滿足條件的記錄後,就會停止繼續檢索。

雖然普通索引需要再判斷下乙個記錄,但由於b+樹的葉子結點是一起載入到記憶體中的,所以這個檢查並不需要耗費過多的時間,在查詢時兩種索引的效能基本相同。

當需要更新乙個資料頁時,如果資料頁在記憶體中就直接更新,而如果這個資料頁還沒有在記憶體中的話,在不影響資料一致性的前提下,inoodb會將這些更新操作快取在change buffer中,這樣就不需要從磁碟中讀入這個資料頁了。在下次查詢需要訪問這個資料頁的時候,將資料頁讀入記憶體,然後執行change buffer中與這個頁有關的操作。通過這種方式就能保證這個資料邏輯的正確性。change buffer由儲存引擎負責持久化,寫入磁碟

將change buffer中的操作應用到原資料頁,得到最新結果的過程稱為merge。除了訪問這個資料頁會觸發merge外,系統有後台執行緒會定期merge。在資料庫正常關閉(shutdown)的過程中,也會執行merge操作。

顯然更多的利用change buffer,減少讀磁碟,語句的執行速度會得到明顯的提公升。而且,資料讀入記憶體是需要占用buffer pool的,所以這種方式還能夠避免占用記憶體,提高記憶體利用率。因此,對於寫多讀少的業務來說,頁面在寫完以後馬上被訪問到的概率比較小,此時change buffer的使用效果最好。這種業務模型常見的就是賬單類、日誌類的系統。

由於唯一索引在插入資料時需要判斷唯一性,所以必須將所有資料載入到記憶體中,這時直接更新記憶體就行了,沒有必要用change buffer 了,所以,唯一索引不會用到change buffer,普通索引可以應用change buffer

當進行插入資料的操作時,如果目標頁在記憶體中,則兩種索引效能類似,如果目標頁不在記憶體中,普通索引在change buffer的加持下效能會更好。

當你更新完之後需要立即查詢時,就應關閉change buffer,其餘情況盡量採用普通索引與change buffer結合使用。

redo log 主要節省的是隨機寫磁碟的io消耗**成順序寫),而change buffer主要節省的則是隨機讀磁碟的io消耗,如果沒有change buffer, 執行更新的「當時那一刻」,就要求從磁碟把資料頁讀出來(這個操作是隨機讀)。

mysql實戰45講

MySQL 普通索引 唯一索引和主索引

1 普通索引 普通索引 由關鍵字key或index定義的索引 的唯一任務是加快對資料的訪問速度。因此,應該只為那些最經常出現在查詢條件 wherecolumn 或排序條件 orderbycolumn 中的資料列建立索引。只要有可能,就應該選擇乙個資料最整齊 最緊湊的資料列 如乙個整數型別的資料列 來...

MySQL 普通索引 唯一索引和主索引

1.普通索引 普通索引 由關鍵字key或index定義的索引 的唯一任務是加快對資料的訪問速度。因此,應該只為那些最經常出現在查詢條件 where column 或排序條件 order by column 中的資料列建立索引。只要有可能,就應該選擇乙個資料最整齊 最緊湊的資料列 如乙個整數型別的資料...

MySQL 普通索引 唯一索引和主索引

1 普通索引 普通索引 由關鍵字key或index定義的索引 的唯一任務是加快對資料的訪問速度。因此,應該只為那些最經常出現在查詢條件 wherecolumn 或排序條件 orderbycolumn 中的資料列建立索引。只要有可能,就應該選擇乙個資料最整齊 最緊湊的資料列 如乙個整數型別的資料列 來...