阿里面試:2 億資料秒查,MySQL 索引為什麼那麼快?

資料庫工作筆記發表於2023-12-22

來源:mikechen的網際網路架構

最近有同學參加阿里面試時,被問到了這道題目。

2 億條資料實現秒查,MySQL 索引為什麼那麼快?

在 2 億條資料中,查詢一條資料:

  • 不使用索引耗時約 200 萬秒,逐行查詢,全表遍歷


  • 使用索引耗時 1 秒不到,快速定位資料行,加快查詢速度


阿里面試:2 億資料秒查,MySQL 索引為什麼那麼快?


MySQL 索引是資料庫效能最佳化的關鍵它可以提高資料庫的查詢效率,資料量越大,這種優勢就越明顯。

大家好,我是 mikechen,本文主要介紹 MySQL 索引。先來簡單回顧下索引的概念。

01
  索引是什麼

索引是儲存引擎用於快速查詢記錄的一種資料結構,透過規則的資料結構和實際目標關聯,根據特定規則演算法,快速實現定址的功能。

阿里面試:2 億資料秒查,MySQL 索引為什麼那麼快?

索引類似於手機通訊錄的首字母檢索

當我們想要查詢某個人的電話號碼時,是依據聯絡人姓名的首字母查詢,從而找到其電話號碼的。

試想下,如果手機通訊錄沒有首字母檢索,就需要逐一查詢,有 10000 個聯絡人,就 GG 了......


阿里面試:2 億資料秒查,MySQL 索引為什麼那麼快?


02
  為什麼要使用索引?

為了便於理解,下面透過具體例子,來了解索引的使用原理。


假設:


有一個使用者表,需要查詢 ID 為【 4 、趙六】的資料。


select*from User where ID=4

我們先來看看,在不使用索引的情況下,資料庫是如何查詢資料的。

1)不使用索引

不使用索引,資料庫預設是全文搜尋查詢,採用的是全表掃描。

即:先遍歷所有的頁面,再遍歷頁面中的記錄,逐條記錄比對,最後找到需要查詢的記錄。

在大資料量中查詢資料時,就會消耗大量的時間和資源。

不使用索引,資料庫查詢資料的過程:

阿里面試:2 億資料秒查,MySQL 索引為什麼那麼快?

如圖,經過順序查詢、進行 5 次定址,查詢到了 ID 為【 4 、趙六】的資料。

按照這個方法,我們來計算下,如果要在 2 億條資料中,查詢指定的某條資料,需要使用多長時間?

時間複雜度是 O(N),N 是指總的記錄條數。

MySQL 資料是寫在磁碟上的,一次磁碟定址所需要的時間是 10 ms。

2 億條資料,執行一次查詢耗時 20 億毫秒,即 200 萬秒。

也就是說,不使用索引,在 2 億條資料中查詢某一條資料,需要使用約 23 天。差不多小 1 個月,查詢效率太低。

如果我們使用索引,查詢效率會有多大的改善呢?我們接著往下看。

2)使用索引

使用索引,資料庫查詢資料的過程:

阿里面試:2 億資料秒查,MySQL 索引為什麼那麼快?

如圖,使用平衡二叉樹索引,只用 3 次就完成了資料查詢。

一個簡單的索引實現,我們把所有的資料排序,透過二分查詢的方式來查詢,查詢的時間複雜度是 O(logN)。

2 億條資料中查詢一條資料,只需要 40 多次查詢,耗時小於 1 秒。

顯然,在使用索引後,查詢效率顯著提高。且資料量越大,索引的這種優勢就越明顯。

03
  索引的作用

  • 提高查詢效率:透過快速定位資料行,加快查詢操作的執行速度;


  • 最佳化排序:在排序操作中,減少資料的掃描和比較次數,提高排序效率;


  • 保證資料的唯一性:唯一索引可以確保特定列上的資料唯一性,防止重複值的插入;


  • 提供約束:透過主鍵和唯一索引,可以對資料的完整性和唯一性進行約束。


04
  索引的優缺點

索引最主要的優點是提高查詢效率,但同時也會帶來一些效能和儲存方面的開銷。

索引的主要優點:

  • 索引極大減少了伺服器需要掃描的資料量,提高了資料的檢索速度;


  • 可以幫助伺服器避免排序和建立臨時表;


  • 可以將隨機 IO 變成順序 IO;


  • 透過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性;


  • 在使用分組和排序子句進行資料檢索時,可以顯著減少查詢中分組和排序的時間。


索引的主要缺點:

  • 建立索引和維護索引需要耗費時間,這種時間隨著資料量的增加而增加;


  • 需要佔用物理空間;


  • 對錶中的資料進行增、刪、改時,索引也要動態的維護,增加了維護成本。


在實際應用中,綜合權衡索引的優缺點、以及具體查詢場景,合理使用索引。


PS.


對於非常小的表,多數情況下用全表掃描更高效。


另外,如果某個資料列包含許多重複的內容,建立索引也沒有太大的實際效果。


總結


透過本文,我們瞭解並掌握了索引的概念、作用、原理及優缺點這部分內容既是精進 MySQL 的基石,也是 MySQL 面試的高頻知識點,非常重要。

來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70027826/viewspace-3001174/,如需轉載,請註明出處,否則將追究法律責任。

相關文章