面試數據庫八股文十問十答第十期
作者:程序員小白條,個人博客
相信看了本文后,對你的面試是有一定幫助的!關注專欄后就能收到持續更新!
?點贊?收藏?不迷路!?
1)為什么不推薦多表Join?
多表 Join 在數據庫查詢中是常見的操作,但在某些情況下可能會導致性能問題:
- 性能影響: 當連接的表數量增加時,查詢性能可能會下降。尤其是當連接的表中有大量數據或者沒有合適的索引時,數據庫引擎需要執行大量的數據掃描和內存操作,導致查詢變慢。
- 復雜性增加: 多表 Join 可能會導致查詢語句變得復雜難以理解和維護。特別是在連接多個表時,需要考慮連接條件、連接順序等問題,容易出現錯誤。
- 并發性問題: 多表 Join 可能導致數據庫鎖的競爭增加,從而影響系統的并發性能。特別是在高并發場景下,多表 Join 可能會導致數據庫資源爭奪,降低系統的吞吐量。
因此,盡管多表 Join 是數據庫查詢中常用的操作,但在實際應用中需要謹慎使用,特別是在大數據量、高并發的場景下,需要考慮查詢性能、復雜性和并發性等方面的問題。
2)MySQL 深度分頁有什么解決思路?
在處理大數據量的情況下,如果需要進行深度分頁(即跳過大量的行再進行查詢),傳統的 LIMIT offset, limit 查詢可能會導致性能問題。因為數據庫需要掃描并跳過 offset 行之前的數據,這會導致性能下降。以下是一些解決思路:
- 使用游標分頁: 使用游標進行分頁查詢,可以避免數據庫掃描和跳過 offset 行的問題。通過在每次查詢中記錄上次查詢的最后一條記錄的主鍵或唯一鍵值,然后基于這個鍵值進行下一次查詢,可以實現高效的分頁查詢。
- 使用基于范圍的分頁: 通過記錄上一次查詢結果的最后一條記錄的值,然后在下一次查詢中使用 WHERE 條件限制范圍,可以實現高效的分頁查詢。例如,
WHERE id > last_id ORDER BY id LIMIT page_size
。 - 使用緩存: 對于靜態或者不經常變化的數據,可以將查詢結果緩存起來,以提高分頁查詢的性能。可以使用內存緩存或者分布式緩存來實現。
- 優化查詢語句: 對于復雜的查詢語句,可以優化數據庫的索引和查詢計劃,以提高查詢性能。可以使用 Explain 或者 Profile 命令來分析查詢語句的性能瓶頸,然后針對性地進行優化。
3)如何監控慢 SQL?
監控慢 SQL 對于及時發現和解決數據庫性能問題非常重要。以下是一些常用的監控慢 SQL 的方法:
- 使用數據庫性能監控工具: 可以使用數據庫性能監控工具來監控數據庫的性能指標和慢查詢日志,例如 MySQL 的 Performance Schema 或者 Percona Toolkit。
- 配置慢查詢日志: 可以在數據庫服務器上配置慢查詢日志,記錄執行時間超過閾值的查詢語句。可以通過分析慢查詢日志來發現潛在的性能問題。
- 使用監控系統: 可以使用監控系統來監控數據庫的性能指標和慢查詢情況,例如 Prometheus、Datadog 等監控系統。
- 定期分析和優化: 定期分析數據庫的性能指標和慢查詢日志,發現潛在的性能問題,并進行優化。可以通過分析查詢執行計劃、添加索引、優化 SQL 語句等方式來提高查詢性能。
- 實時警報: 可以配置實時警報機制,當發現慢查詢或者性能異常時及時發送警報通知相關人員,以便及時處理和解決問題。
綜上所述,監控慢 SQL 是數據庫性能優化的重要手段,通過合適的監控工具和方法,可以及時發現和解決數據庫性能問題,保障系統的穩定性和性能。
4)Delete、Drop、Truncate 有什么區別?
- DELETE: DELETE 語句用于從表中刪除行,但保留表的結構。它會觸發表的觸發器(如果有的話),并且可以與 WHERE 子句一起使用來指定要刪除的行。DELETE 語句執行后,表的空間不會釋放,而是會留下被刪除行的空間用于后續的插入。
- DROP: DROP 語句用于完全刪除數據庫中的表,包括表的結構和數據。執行 DROP 語句后,表的定義以及表中的所有數據都會被永久刪除,無法恢復。
- TRUNCATE: TRUNCATE 語句用于從表中刪除所有的行,但保留表的結構。與 DELETE 不同的是,TRUNCATE 語句不會觸發表的觸發器,并且通常比 DELETE 語句執行得更快,因為它不會記錄刪除的行。執行 TRUNCATE 后,表的空間會被釋放,但表的定義仍然保留。
5)Inner Join、Left Join、Right Join 有啥區別?
- Inner Join(內連接): Inner Join 返回兩個表中匹配行的交集。即只返回兩個表中共同滿足連接條件的行。如果一個表中沒有匹配的行,則不會顯示。
- Left Join(左連接): Left Join 返回左表中的所有行,以及右表中匹配的行。如果右表中沒有匹配的行,則會用 NULL 填充。換句話說,無論右表中是否有匹配的行,左表中的每一行都會顯示。
- Right Join(右連接): Right Join 和 Left Join 相反,它返回右表中的所有行,以及左表中匹配的行。如果左表中沒有匹配的行,則會用 NULL 填充。換句話說,無論左表中是否有匹配的行,右表中的每一行都會顯示。
6)索引失效的場景列舉一下
索引失效通常是指數據庫查詢時,本應使用索引加速查詢,但由于某些原因導致索引無法發揮作用,查詢性能降低。以下是一些常見的索引失效場景:
- 未使用索引列: 當查詢中的條件不是索引列,或者條件中使用了函數、類型轉換等操作時,數據庫可能無法使用索引。
- 使用不等于(!=): 不等于操作符(!=)通常無法利用索引,因為它不是一個范圍查詢,而是一個非范圍查詢。
- 使用 LIKE 操作符: 如果 LIKE 操作符的模式以通配符開頭(例如 ‘%value’),索引也無法被利用。但如果模式不以通配符開頭(例如 ‘value%’),索引可以被利用。
- 使用 OR 操作符: 當查詢條件中使用 OR 操作符連接多個條件時,如果其中一個條件無法使用索引,整個查詢可能都無法使用索引。
- 表達式索引失效: 當索引列參與了表達式、函數或者類型轉換等操作時,索引可能會失效。
- 隱式類型轉換: 當查詢條件中的列類型與索引列的類型不匹配,或者類型需要進行隱式類型轉換時,索引可能會失效。
- 統計信息不準確: 如果數據庫的統計信息不準確,可能會導致數據庫選擇錯誤的執行計劃,從而導致索引失效。
綜上所述,索引失效可能會導致數據庫查詢性能下降,因此在設計數據庫索引和查詢時,需要注意避免以上列舉的情況,以確保索引能夠發揮應有的作用。
7)怎么查詢索引是否被使用
要查看索引是否被查詢使用,可以通過數據庫的性能監控工具或者執行計劃來進行檢查。在大多數數據庫系統中,可以使用以下方法:
- 執行計劃(Explain): 使用數據庫系統提供的 EXPLAIN 或類似的關鍵字,可以查看查詢語句的執行計劃。執行計劃會顯示查詢是如何執行的,包括是否使用了索引。
- 性能監控工具: 大多數數據庫系統提供了性能監控工具,可以用來監控數據庫的性能指標。這些工具通常會顯示每個查詢的執行情況,包括是否使用了索引。
8)索引優化的例子舉幾個
索引優化是提高數據庫查詢性能的關鍵。以下是一些常見的索引優化例子:
- 選擇合適的索引類型: 根據查詢的特點選擇合適的索引類型,如普通索引、唯一索引、組合索引等。
- 刪除不必要的索引: 刪除沒有使用或者很少使用的索引,以減少索引維護的開銷。
- 創建覆蓋索引: 創建覆蓋索引可以減少查詢的 IO 操作,提高查詢性能。
- 優化索引列順序: 對于組合索引,將最常用的列放在前面可以提高索引的效率。
- 避免使用 SELECT *: 盡量避免使用 SELECT * 查詢所有列,而是只查詢需要的列,以減少索引的使用和 IO 操作。
9)數據庫常用引擎有哪些?
常用的數據庫引擎包括但不限于:
- MySQL: InnoDB、MyISAM、Memory、Archive 等。
- PostgreSQL: PostgreSQL 默認引擎、PostgreSQL 后端引擎。
- SQL Server: SQL Server 默認引擎、SQL Server 后端引擎。
- Oracle: Oracle 默認引擎、Oracle 后端引擎。
- SQLite: SQLite 默認引擎。
不同的數據庫引擎具有不同的特點和適用場景,選擇合適的引擎取決于具體的需求和情況。
10)數據庫事務是什么意思?
數據庫事務是指一組數據庫操作,要么全部成功執行,要么全部失敗回滾,保證數據庫的一致性和完整性。事務具有以下四個特性,通常被稱為 ACID 特性:
- 原子性(Atomicity): 事務中的所有操作要么全部執行成功,要么全部失敗回滾,不存在部分執行的情況。
- 一致性(Consistency): 事務在執行前后,數據庫的狀態應保持一致性。即數據庫的完整性約束應得到滿足。
- 隔離性(Isolation): 事務之間應該相互隔離,一個事務的執行不應該影響其他事務的執行。數據庫系統需要保證事務之間的隔離性,以避免并發執行時出現問題。
- 持久性(Durability): 一旦事務提交,其對數據庫的修改應該是永久性的,即使發生系統崩潰或斷電等故障,數據庫的狀態也應該能夠恢復到事務提交后的狀態。
事務可以通過 BEGIN TRANSACTION、COMMIT、ROLLBACK 等語句來控制。在數據庫應用中,事務通常用于保證復雜操作的一致性,確保數據的完整性和可靠性。
開源項目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system
前后端總計已經 1300+ Star,2W+ 訪問!
?點贊?收藏?不迷路!?