MySql分享之索引

2022-09-10 00:06:40 字數 1316 閱讀 1718

mysql 是乙個關係型資料庫管理系統,由瑞典 mysql ab 公司開發,屬於 oracle 旗下產品。mysql 是最流行的關係型資料庫管理系統之一,在 web 應用方面,mysql 是最好的 rdbms (relational database management system,關聯式資料庫管理系統) 應用軟體之一。

今天我們就來聊聊 mysql 的索引。儘管 mysql 有許多優點,但是在海量資料的情況下,效能方面的表現還是會讓人捉急,這時候就輪到 mysql 的索引出場了。我會以丟擲問題然後解決問題的方式來進行本次分享。比如:什麼是索引?索引可以做什麼?為什麼使用索引可以提高效率?mysql 支援哪些索引型別?什麼情況下應不建或少建索引?什麼是聯合索引?為什麼說 b + 比 b 樹更適合實際應用中作業系統的檔案索引和資料庫索引?

一、什麼是索引?

官方解釋:索引 (index) 是幫助 mysql 高效獲取資料的資料結構。

通俗理解:索引是一種特殊的檔案(innodb 資料表上的索引是表空間的乙個組成部分),它們包含著對資料表裡所有記錄的引用指標。

二、索引可以做什麼?

首先,索引不是萬能的,索引可以加快資料檢索操作,但會使資料修改操作變慢。每次修改資料記錄,索引就必須重新整理一次。為了在某種程度上彌補這一缺陷,許多 sql 命令都有乙個 delay_key_write 項。這個選項的作用是暫時制止 mysql 在該命令每插入一條新記錄和每修改一條現有之後立刻對索引進行重新整理,對索引的重新整理將等到全部記錄插入 / 修改完畢之後再進行。在需要把許多新記錄插入某個資料表的場合,delay_key_write 選項的作用將非常明顯。

三、為什麼使用資料索引能提高效率?

資料索引的儲存是有序的

在有序的情況下,通過索引查詢乙個資料是無需遍歷索引記錄的

極端情況下,資料索引的查詢效率為二分法查詢效率,趨近於 log2 (n)

四、mysql 支援哪些索引型別?

我們這裡說的索引型別並不是指 「主鍵索引」、「外來鍵索引」 這些,而是索引底層的資料結構。mysql 的索引資料結構支援以下兩種:

b-tree 索引。b + 樹是乙個平衡的多叉樹,從根節點到每個葉子節點的高度差值不超過 1,而且同層級的節點間有指標相互鏈結,是有序的

hash 索引。雜湊索引就是採用一定的雜湊演算法,把鍵值換算成新的雜湊值,檢索時不需要類似 b + 樹那樣從根節點到葉子節點逐級查詢,只需一次雜湊演算法即可,是無序的

雜湊索引的優勢:等值查詢,雜湊索引具有絕對優勢(前提是:沒有大量重複鍵值,如果大量重複鍵值時,雜湊索引的效率很低,因為存在所謂的雜湊碰撞問題。)

雜湊索引不適用的情況:

不支援範圍查詢

不支援索引完成排序

不支援聯合索引的最左字首匹配規則

mysql索引之聚集索引

聚集索引不是一種單獨的索引型別,而是一種儲存資料方式。其具體細節依賴於實現方式,但是innodb的聚集索引實際上在同樣的結構中儲存了b tree索引和資料行。當表有聚集索引的時候,它的資料行實際儲存在索引的葉子頁中。術語 聚集 指實際的資料行和相關的鍵值都儲存在一起。每個表只能有乙個聚集索引,因為不...

mysql索引 之覆蓋索引

今天參考了 高效能mysql 與幾篇博文,總結一下我個人的對覆蓋索引的理解。首先,覆蓋索引並不是一種新的資料結構,它的意思是在查詢的時候,利用到的索引已經完全包含需要查詢欄位的情況,在這種情況下,查詢結果直接就是索引的值,並不需要再利用索引回表查詢了。繼續拿sakila資料庫 mysql安裝好後自帶...

mysql索引之雜湊索引

雜湊演算法時間複雜度為o 1 且不只存在於索引中,每個資料庫應用中都存在該資料結構。雜湊表也為雜湊表,又直接定址改進而來。在雜湊的方式下,乙個元素k處於h k 中,即利用雜湊函式h,根據關鍵字k計算出槽的位置。函式h將關鍵字域對映到雜湊表t 0.m 1 的槽位上。上圖中雜湊函式h有可能將兩個不同的關...