1
【Q】:Mysql中的數據排序是怎么實現的?
【A】:
- 排序過程中如果字段有索引,則利用索引排序。反之使用文件排序。在文件排序中,如果數據量少則在內存中排序,使用單路排序或雙路排序。如果數據量大則利于磁盤文件進行外部排序,一般是歸并排序。
2
【Q】:Mysql的Chang Buffer是什么?
【A】:
- Chang Buffer是Mysql InnoDB存儲引擎的一個機制,用于暫存對二級索引的刪除和更新操作的變更,而不是立刻執行這些操作,隨后,當InnoDB進行合適的條件時(如頁被讀取或Flush操作),會將這些變更寫入到二級索引中。
- 作用:
- 提高寫入性能,提高對二級索引的變更緩存,可以減少對磁盤的頻繁寫入,提升插入和更新操作的性能。
- 批量處理,Chang Buffer 可以在后續的操作中批量處理這些變更,減少了隨機寫入的開銷。
3
【Q】:詳細描述一下一條SQL語句在MySQL的執行過程
【A】:
- 先通過連接器校驗權限。
- 再利用分析器進行SQL語句的詞法分析和語法分析,構建解析樹。
- 使用優化器選擇合適的索引和表連接順序,最終選擇一個最佳的執行計劃。
4
【Q】:Mysql主要的存儲引擎包括:
【A】:
- InnoDB:支持事務 ,行級鎖和外鍵。提供高并發性能,適用于高負載的OLTP應用。數據以聚集索引的方式存儲,提高檢索效率。
- MyISAM:不支持事務和外鍵,適用表級鎖。適合讀取多,更新少的場景,如數據倉庫。具有較高的讀性能和較快的表級鎖定
- MEMORY和NDB和ARCHIVE。
5
【Q】:Mysql的索引類型有什么?
【A】:
- 從數據結構角度來看,Mysql索引可以分為以下幾類:
- B+樹索引
- 哈希索引
- 倒排索引(即全文索引 Full-Text)
- R-樹索引(多維空間樹)
- 從常見的基于InnoDB B+樹索引角度來看,可以分為:
- 聚簇索引
- 非聚簇索引
- 索引性質角度來看,普通索引,主鍵索引,聯合索引,唯一索引,全文索引,空間索引
6
【Q】:InooDB 引擎中的聚簇索索引和非聚簇索引區別
【A】:
- 聚簇索引
- 索引葉子節點存儲的是數據行,可以直接訪問完整數據。
- 每一個表只能有一個聚簇索引,通常是主鍵索引,適合訪問查詢和排序
- 非聚簇索引
- 索引葉子節點存儲的是數據行的主鍵和對應的索引列,需通過主鍵才能訪問完整的數據行。
- 一個表可以有多個非聚簇索引,適用于快速查找特定列的數據。
7
【Q】:MySQL里面的回表是什么?
【A】:
- 回表是指在使用二級索引(非聚簇索引)作為進行查詢時,由于二級索引中只存儲了索引字段的值和對應的主鍵值,無法獲得其他數據。如果要查詢數據行中的其他數據,需要根據主鍵去聚簇索引中查找實際的數據行,這個過程被稱為回表。
8
【Q】:索引的最左前綴匹配原則是什么?
【A】:
- Mysql索引的最左前匹配原則是指在使用聯合索引時,查詢條件必須從索引條件的最左側開始匹配。如果一個聯合索引包含多個列,查詢條件必須包含第一列的條件,然后是第二列,以此類推。
- 底層原理:因為聯合索引在B+樹中的排序方式遵循“從左到右”的順序,列如聯合索引(frist_name,last_name, age)會按照此順序在B+樹中進行排序。
- 組合索引能從左到右依次高效匹配,跳過最左側字段會導致無法利用該索引。
9
【Q】:Mysq覆蓋l索引是什么?
【A】:
- Mysql覆蓋索引是指二級索引中包含了查詢所需的所有字段,從而使查詢可以僅通過訪問二級索引而不需要訪問實際的表數據(主鍵索引)。
10
【Q】:索引下推是什么?
【A】:
- 索引下推是一種減少回表查詢,提高查詢效率的技術。允許Mysql在使用索引查找數據時,將部分查找條件下推到存儲引擎層過濾,從而減少需要從表中讀取的數據行,減少IO(本應該由service做的操作交給了存儲引擎層操作,因此叫做下推)。