mysql資料結構面試題 MySQL 面試題

2021-10-17 15:51:21 字數 3280 閱讀 1909

mysql 的一些面試題,有的是平時聊到的,有的是聽別人說的,有的是工作中遇到的,特此彙總一下,有問有答。

一條 sql 查詢語句執行流程?

1、聯結器。客戶端和伺服器 tcp 握手後,驗證使用者名稱密碼。使用者名稱密碼通過後,聯結器會到許可權表中查詢你擁有的許可權。之後這個連線裡面的許可權判斷邏輯,都將依賴於此時讀到的許可權。這就意味著,乙個使用者成功建立連線後,即使你用管理員賬號對這個使用者的許可權做了修改,也不會影響已經存在連線的許可權。修改完成後,只有再新建的連線才會使用新的許可權設定。

2、查詢快取。如果快取開啟,則查詢快取,key 是查詢的語句,value 是查詢的結果。(如果找到結果直接返回客戶端)

3、分析器。mysql 首先識別關鍵字確定你要做什麼,然後會對 sql 語法分析,然後將 sql 解析成 認識的語法,如果有問題,mysql 會丟擲語法錯誤。

4、優化器。比如:在表裡面有多個索引的時候,決定使用哪個索引。或者在乙個語句有多表關聯(join)的時候,決定各個表的連線順序。

5、執行器。首先判斷對操作表有沒有許可權,如果有許可權就執行呼叫儲存引擎的 api 介面獲取資料,如果沒有許可權就報錯。

參考:【mysql實戰45講】01 一條sql查詢語句是如何執行的(一)

mysql 有必要開啟查詢快取嗎?

1、查詢快取需要每次將查詢查詢結果以查詢語句(key)和查詢結果(value)的方式儲存起來,這些都是一些資源消耗。

2、對於操作頻繁的表沒有必要開啟快取,因為簡單的更新操作就會使快取失效,這樣會導致有些快取還未使用就已經失效了。

3、如果是一張靜態表,很長時間才會更新一次,可以開啟快取,這樣快取的命中率會高一些。

4、需要注意的是 mysql 8.0 已經把查詢快取功能放棄了。

查詢優化器工作流程?

一條 sql 有很多條查詢方案,在一條 sql 真正執行之前,查詢優化器會找出 sql 所有執行的方案進行分析,然後對比找出成本最低的方案,但是成本最低的方案並不是響應時間最短的方案。

優化過程大致如下:

1、根據搜尋條件,找出所有可能使用的索引。

2、計算全表掃瞄的代價。

3、計算使用不同索引執行查詢的代價。

4、對比各種執行方案的代價,找出成本最低的那乙個。

mysql 常見的幾種儲存引擎?

常見的儲存引擎有 myisam、innodb、memory。

myisam 儲存引擎和 innodb 儲存引擎有什麼區別?

1、innodb 在 mysql 5.5.5 版本後是 mysql 的預設儲存引擎。

3、myisam 支援表鎖,不支援行鎖,不支援事物,資料以緊密格式儲存,支援壓縮表和空間資料索引。

myisam 和 innodb 儲存引擎的資料結構是什麼?

1、兩種儲存引擎都是 b+tree。

2、mysql 葉節點儲存的是實際資料的位址值,它的索引和實際資料是分開的,只不過使用索引指向了實際資料。這種索引的模式被稱為非聚集索引。

3、innodb 葉節點儲存的都是實際的資料,這種索引有被稱為聚集索引。

什麼是索引?

1、索引是儲存引擎用於快速找到記錄的一種資料結構。

2、通俗點講,相當於一本書的目錄部分。

mysql 有哪幾種索引?

b+tree、雜湊、全文索引、rtree(空間資料索引)

索引的優點?

1、大大減少了伺服器需要掃瞄的資料行數。

2、幫助伺服器避免進行排序和分組。

3、以及避免建立臨時表(b+tree 索引是有序的,可以用於 order by 和 group by 操作。臨時表主要是在排序和分組過程中建立,不需要排序和分組,也就不需要建立臨時表)。

4、將隨機 i/o 變為順序 i/o(b+tree 索引是有序的,會將相鄰的資料都儲存在一起)。

5、是最有效的查詢優化手段。

為什麼要重建索引?

1、索引可能因為刪除,或者頁**等原因,導致資料頁有空洞。

2、重建索引的過程會建立乙個新的索引,把資料按順序插入,這樣頁面的利用率最高,也就是索引更緊湊、更省空間。

索引具體採取的那種資料結構?

1、mysql 常見的索引資料結構有 b+tree 和雜湊。

2、mysql 和 innodb 預設索引結構是 b+tree。

3、memory 預設索引結構是雜湊。

b+tree 和雜湊的區別嗎?

雜湊索引只支援等值比較查詢,包括 =、in()、<=>(注意 <> 和 <=> 是不同的操作)。也不支援任何範圍查詢,例如 where price > 100。因為是一次定位,所以雜湊索引查詢的速度非常快。由於雜湊索引並不是按照索引值順序儲存的,所以無法用於排序和分組。

b+tree 是由 b+樹為儲存結構實現的。b+tree 索引是從根節點到枝節點,最後才能到葉節點這樣多次 i/o 訪問,所以速度要慢於雜湊索引。因為 b+tree 是按照順序來建立索引樹的(左子節點小於父節點,父節點小於右子節點),所以支援排序和分組操作。

聚簇索引和非聚簇索引的區別?

1、聚簇索引的葉子節點中儲存的是行的全部資料,查詢的時候直接返回結果,並不需要回表。

2、非聚簇索引的葉子節點中儲存的是主鍵的值,需要找到主鍵的值,才能找到資料,需要查詢兩次 b+tree。

3、索引覆蓋也是只查詢一次。

mysql 組合索引使用為什麼要遵循最左原則?

1、因為 b+tree 是按照從左到右的順序來建立搜尋樹的。

2、比如索引 (name, age, ***),索引會先比較 name,如果 name 一樣,會再依次比較 age,***,最後獲取檢索的資料。

mysql 索引如果組合索引都使用上,用遵循最左原則嗎?

不用。因為查詢優化器會為我們選擇合適的索引。比如 (name, age, ***) 組合索引中,where 條件中只要出現了最左邊的 name 欄位就會匹配上。

mysql 組合索引多個字段之間的順序怎麼選擇?

將選擇性最高的列放在最左邊,這樣能夠更快的過濾出需要的行。

有乙個計算公式:

select count(distinct staff_id)/count(*) as staff_id_selectivity,

count(distinct customer_id)/count(*) as customer_id_selectivity,

count(*)

from payment;

什麼是索引下推?

1、mysql 5.6 引入索引下推(icp)。

2、explain 分析結果中 extra 會顯示 using index condition。

參考:index condition pushdown optimization

mysql icp 索引條件下推優化

未完待續……

資料結構 面試題

python實現 寫個大概,import re def quick sort alist,first,last if first last return mid value alist first low first high last while low high while low mid va...

資料結構 面試題

2.棧2.2使用棧計算字尾表示式 2.3對棧的元素進行排序 2.4判斷表示式是否括號平衡 3.佇列 4.鍊錶 5.樹6.圖 7.字典樹 這是一種高效的樹形結構,但值得單獨說明 8.雜湊表 雜湊表 1.1 尋找陣列中第二小的元素 思路 公升序排序之後,輸出第二個數字 1.2 找到陣列中第乙個不重複出現...

微軟資料結構面試題

1 反轉乙個鍊錶。迴圈演算法。1 list reverse list l 13 return tmp 14 2 反轉乙個鍊錶。遞迴演算法。1 list resverse list l 8 return n 9 3 廣度優先遍歷二叉樹。1 void bst tree t 11 1class node ...