面試數據庫八股文十問十答第六期
作者:程序員小白條,個人博客
相信看了本文后,對你的面試是有一定幫助的!關注專欄后就能收到持續更新!
?點贊?收藏?不迷路!?
1)來說說一條 SQL 語句的執行過程?
- 詞法分析(Lexical Analysis):將 SQL 語句分解為一個個 Token,例如關鍵字、標識符、操作符等。
- 語法分析(Syntax Analysis):驗證 SQL 語句的語法是否正確,并生成語法樹。
- 語義分析(Semantic Analysis):驗證 SQL 語句的語義是否正確,例如表、字段是否存在,權限是否足夠等。
- 查詢優化(Query Optimization):根據語義樹生成多個查詢執行計劃,并選擇最優的執行計劃。
- 執行計劃生成(Execution Plan Generation):將最優執行計劃轉換為實際的執行操作序列。
- 執行(Execution):執行生成的操作序列,從存儲引擎中讀取數據、進行計算、返回結果等。
2)MySQL 的存儲引擎有哪些?有什么區別?
MySQL 的常見存儲引擎包括:
- InnoDB:默認的存儲引擎,支持事務、行級鎖、外鍵等特性,適合于高并發、大數據量的應用。
- MyISAM:不支持事務和行級鎖,但具有較高的讀取性能和全文索引的支持,適用于讀密集型的應用。
- MEMORY:將表存儲在內存中,讀寫速度快,但數據不持久化,適用于臨時表和緩存等場景。
- Archive:壓縮存儲引擎,適合于大量歷史數據的存儲和查詢,但不支持索引和事務。
這些存儲引擎在功能特性、性能表現和適用場景上有所區別,選擇合適的存儲引擎可以提升數據庫的性能和可靠性。
3)MySQL 的索引有哪幾類?
MySQL 的索引主要分為以下幾類:
- B-Tree 索引:最常見的索引類型,適用于等值查詢、范圍查詢和排序查詢。
- 哈希索引:適用于等值查詢,不支持范圍查詢和排序查詢,查詢性能穩定但局限性較大。
- 全文索引:用于全文搜索,適用于文本字段的模糊查詢。
- 空間索引:用于地理空間數據的索引,支持空間數據的查詢和分析。
每種索引類型都有自己的適用場景和限制,合理選擇和使用索引可以提升數據庫的查詢性能和效率。
4)聚簇索引和非聚簇索引有什么區別?
- 聚簇索引(Clustered Index):數據行的物理順序與索引的邏輯順序一致。在聚簇索引下,表的數據按照索引的順序存儲,因此一個表只能有一個聚簇索引。InnoDB 存儲引擎的主鍵索引就是一個典型的聚簇索引。
- 非聚簇索引(Non-clustered Index):索引中保存的是指向數據行的指針,而不是數據行本身。在非聚簇索引下,數據行的物理存儲順序與索引的邏輯順序不一定一致。一個表可以有多個非聚簇索引,常見的非聚簇索引有普通索引和唯一索引。
5)什么是回表?
回表指的是當通過索引查詢獲取到了行的主鍵或聚簇索引,但是需要進一步到數據頁中查找其他的列數據時的操作。如果一個查詢不能完全通過索引滿足,需要通過主鍵或聚簇索引再去數據頁中查詢數據,這個過程就稱為回表。回表會增加額外的IO操作,影響查詢性能,因此在設計索引時需要考慮覆蓋索引等優化手段來避免回表操作。
6)什么是最左匹配原則?
最左匹配原則是指,在多列索引中,如果查詢條件涉及到了多個列,并且使用了聯合索引,那么查詢時只能使用索引中的最左邊連續的列。也就是說,如果查詢條件中使用了索引的前綴列,索引可以被用到;如果查詢條件中的列順序與索引定義的順序不一致,那么索引就無法被利用到。這個原則是基于 B-Tree 索引的特性而來,對于最左前綴匹配的查詢可以快速定位到索引的起始位置,而對于不符合最左匹配原則的查詢則需要進行全表掃描或回表操作,影響查詢性能。
7)什么叫覆蓋索引?
覆蓋索引是指一個查詢可以完全通過索引的數據就能滿足,不需要回表到數據頁中去查找其他列的值。當查詢所需的列都包含在索引中時,數據庫可以直接從索引中獲取數據,而不需要額外的回表操作,這樣的索引就稱為覆蓋索引。覆蓋索引可以提高查詢性能,減少IO操作,特別是對于涉及大量數據的查詢。
8)什么叫索引下推?
索引下推(Index Condition Pushdown,簡稱ICP)是 MySQL 5.6 版本引入的優化特性之一,指的是在使用索引進行查詢時,MySQL 可以在索引中對部分不滿足查詢條件的記錄進行過濾,減少回表的次數。具體來說,當查詢條件中包含索引的列和非索引的列時,MySQL 可以先利用索引定位到滿足索引條件的記錄,然后再對非索引列進行過濾,而不是將所有滿足索引條件的記錄都取出再進行過濾。
9)建索引需要注意什么?
在建立索引時,需要注意以下幾點:
- 選擇合適的列:選擇經常用于查詢條件、連接條件和排序的列建立索引,避免對不常使用的列建立索引,以減少索引的維護開銷和存儲空間。
- 避免過多索引:過多的索引不僅增加了存儲空間,還會增加查詢優化器的選擇成本,并且在數據更新時會增加額外的維護開銷,因此需要權衡索引的數量和性能提升之間的關系。
- 使用覆蓋索引:盡量建立覆蓋索引,避免回表操作,提高查詢性能。
- 注意索引順序:根據查詢的頻率和特點選擇合適的索引順序,利用最左匹配原則。
- 定期維護索引:定期分析索引的使用情況,刪除不再使用的索引,優化查詢性能。
10)用了索引一定就有用嗎?如何排查?
并不是所有情況下使用了索引就一定能提高查詢性能,有時候索引可能會導致性能下降,主要有以下幾種情況:
- 數據分布不均勻:如果索引列的數據分布不均勻,可能會導致某些查詢只能利用到少量的索引,而大部分數據仍需要進行全表掃描,此時索引的效果不明顯。
- 索引失效:當查詢條件中使用了函數、類型轉換或者對列進行了計算時,索引可能會失效,導致無法使用索引優化查詢。
- 索引選擇不當:選擇了不合適的索引,或者建立了過多的索引,都可能導致性能下降。
為了排查索引是否起作用,可以通過以下幾種方式進行:
- 執行計劃分析:通過 explain 命令查看查詢的執行計劃,判斷是否使用了索引。
- 性能測試:對比使用索引和不使用索引的查詢性能,觀察是否有明顯的性能提升。
- 使用慢查詢日志:分析慢查詢日志,查找執行時間較長的查詢,判斷是否存在索引不當的情況。
- 監控系統資源:通過監控系統資源的使用情況,如CPU、內存、磁盤IO等,判斷索引是否對系統資源造成了明顯的影響。
開源項目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system
前后端總計已經 1300+ Star,2W+ 訪問!
?點贊?收藏?不迷路!?