阿里面試:2 億資料秒查,MySQL 索引為什麼那麼快?
來源:mikechen的網際網路架構
最近有同學參加阿里面試時,被問到了這道題目。
2 億條資料實現秒查,MySQL 索引為什麼那麼快?
在 2 億條資料中,查詢一條資料:
不使用索引:耗時約 200 萬秒,逐行查詢,全表遍歷;
使用索引:耗時 1 秒不到,快速定位資料行,加快查詢速度。
MySQL 索引是資料庫效能最佳化的關鍵,它可以提高資料庫的查詢效率,資料量越大,這種優勢就越明顯。
大家好,我是 mikechen,本文主要介紹 MySQL 索引。先來簡單回顧下索引的概念。
索引是儲存引擎用於快速查詢記錄的一種資料結構,透過規則的資料結構和實際目標關聯,根據特定規則演算法,快速實現定址的功能。
索引類似於手機通訊錄的首字母檢索。
當我們想要查詢某個人的電話號碼時,是依據聯絡人姓名的首字母查詢,從而找到其電話號碼的。
試想下,如果手機通訊錄沒有首字母檢索,就需要逐一查詢,有 10000 個聯絡人,就 GG 了......
為了便於理解,下面透過具體例子,來了解索引的使用原理。
假設:
有一個使用者表,需要查詢 ID 為【 4 、趙六】的資料。
select*from User where ID=4
我們先來看看,在不使用索引的情況下,資料庫是如何查詢資料的。
1)不使用索引
不使用索引,資料庫預設是全文搜尋查詢,採用的是全表掃描。
即:先遍歷所有的頁面,再遍歷頁面中的記錄,逐條記錄比對,最後找到需要查詢的記錄。
在大資料量中查詢資料時,就會消耗大量的時間和資源。
不使用索引,資料庫查詢資料的過程:
如圖,經過順序查詢、進行 5 次定址,查詢到了 ID 為【 4 、趙六】的資料。
按照這個方法,我們來計算下,如果要在 2 億條資料中,查詢指定的某條資料,需要使用多長時間?
時間複雜度是 O(N),N 是指總的記錄條數。
MySQL 資料是寫在磁碟上的,一次磁碟定址所需要的時間是 10 ms。
2 億條資料,執行一次查詢耗時 20 億毫秒,即 200 萬秒。
也就是說,不使用索引,在 2 億條資料中查詢某一條資料,需要使用約 23 天。差不多小 1 個月,查詢效率太低。
如果我們使用索引,查詢效率會有多大的改善呢?我們接著往下看。
2)使用索引
使用索引,資料庫查詢資料的過程:
如圖,使用平衡二叉樹索引,只用 3 次就完成了資料查詢。
一個簡單的索引實現,我們把所有的資料排序,透過二分查詢的方式來查詢,查詢的時間複雜度是 O(logN)。
2 億條資料中查詢一條資料,只需要 40 多次查詢,耗時小於 1 秒。
顯然,在使用索引後,查詢效率顯著提高。且資料量越大,索引的這種優勢就越明顯。
提高查詢效率:透過快速定位資料行,加快查詢操作的執行速度;
最佳化排序:在排序操作中,減少資料的掃描和比較次數,提高排序效率;
保證資料的唯一性:唯一索引可以確保特定列上的資料唯一性,防止重複值的插入;
提供約束:透過主鍵和唯一索引,可以對資料的完整性和唯一性進行約束。
索引最主要的優點是提高查詢效率,但同時也會帶來一些效能和儲存方面的開銷。
索引的主要優點:
索引極大減少了伺服器需要掃描的資料量,提高了資料的檢索速度;
可以幫助伺服器避免排序和建立臨時表;
可以將隨機 IO 變成順序 IO;
透過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性;
在使用分組和排序子句進行資料檢索時,可以顯著減少查詢中分組和排序的時間。
索引的主要缺點:
建立索引和維護索引需要耗費時間,這種時間隨著資料量的增加而增加;
需要佔用物理空間;
對錶中的資料進行增、刪、改時,索引也要動態的維護,增加了維護成本。
在實際應用中,綜合權衡索引的優缺點、以及具體查詢場景,合理使用索引。
PS.
對於非常小的表,多數情況下用全表掃描更高效。
另外,如果某個資料列包含許多重複的內容,建立索引也沒有太大的實際效果。
透過本文,我們瞭解並掌握了索引的概念、作用、原理及優缺點。這部分內容既是精進 MySQL 的基石,也是 MySQL 面試的高頻知識點,非常重要。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70027826/viewspace-3001174/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 阿里面試:MySQL索引憑什麼能讓查詢效率提高這麼多?阿里面試MySql索引
- mysql為什麼加索引就能快MySql索引
- Redis為什麼那麼快?Redis
- MYSQL索引為什麼這麼快?瞭解索引的神奇之處MySql索引
- Kafka為什麼速度那麼快?Kafka
- 破玩意 | Redis 為什麼那麼快Redis
- 為什麼資料備份那麼重要?
- MySQL中MyISAM為什麼比InnoDB查詢快MySql
- Mysql索引資料結構為什麼是B+樹?MySql索引資料結構
- MySQL索引那些事:什麼是索引?為什麼加索引就查得快了?MySql索引
- 告訴你MySQL主鍵查詢為什麼這麼快MySql
- 京東二面,Redis為什麼那麼快?Redis
- MySQL 為什麼全文索引查中文找不結果MySql索引
- 面試題:MySQL索引為什麼用B+樹?面試題MySql索引
- [MySQL]為什麼非聚簇索引不儲存資料位置MySql索引
- 索引為什麼能提供查詢效能...索引
- MySQL 中 MyISAM 中的查詢為什麼比 InnoDB 快?MySql
- 深度學習為什麼需要那麼多的資料?深度學習
- MySQL實戰 | 為什麼要使用索引?MySql索引
- Mysql:好好的索引,為什麼要下推?MySql索引
- MySQL索引為什麼使用B+樹?MySql索引
- 【Java面試】Mysql為什麼使用B+Tree作為索引結構Java面試MySql索引
- MySQL索引憑什麼能讓查詢效率提高這麼多?MySql索引
- 自動化測試落地為什麼那麼難
- ClickHouse為什麼查詢速度快?
- 阿里面試:MySQL如何設計索引更高效?阿里面試MySql索引
- NER為什麼那麼難
- 哪有那麼多為什麼?
- MySQL查詢為什麼沒走索引?這篇文章帶你全面解析MySql索引
- 資料庫連線(2) - 為什麼C3P0連線池那麼慢資料庫
- 圖解|12張圖解釋MySQL主鍵查詢為什麼這麼快圖解MySql
- 面試官這樣問你:為什麼MySQL新增索引後就可以提高查詢速度面試MySql索引
- 什麼情況下需要建立索引? 索引的作用?為什麼能夠提高查詢速度?(索引的原理) 索引有什麼副作用嗎?索引
- mysql字首索引是什麼MySql索引
- 什麼是麒麟(kylin)?查資料賊快的喲
- 阿里面試官:MySQL如何設計索引更高效?阿里面試MySql索引
- 為什麼 python 那麼熱門Python
- Oracle 查詢行數很少,為什麼不走索引?Oracle索引