mysql索引相關面試題

2021-10-04 23:26:57 字數 3960 閱讀 7844

(1):儲存引擎主要有: 1. myisam , 2. innodb, 3. memory, 4. archive, 5. federated 。

預設為:innodb 引擎。innodb 底層儲存結構為 b+樹, b 樹的每個節點對應 innodb

的乙個 page,page 大小是固定的,一般設為 16k

(2):使用場景?

1)經常更新的表,適合處理多重併發的更新請求。

2)支援事務。

3)可以從災難中恢復(通過 bin-log 日誌等)。

4)外來鍵約束。只有他支援外來鍵。

5)支援自動增加列屬性 auto_increment。

(1):選擇唯一性索引:唯一性索引的值是唯一的。可以更快的通過該索引來確定某條記錄。

(2):為經常需要排序、分組、以及聯合查詢的列建立索引。

(3):為經常作為查詢條件的列建立索引。

(4):限制索引的數目:越多的索引越導致表的查詢效率變低,因為索引表在每次更新表資料的時候都會重新建立這個表的索引,表的資料越多,索引列越多,那麼建立索引的時間消耗就越大。

(5): 如果索引的值很長,那麼查詢的速度會受到影響。

(6):如果索引欄位的值很長,最好使用值得字首來進行索引。

(7):刪除不再使用或者很少使用的索引。

(8):最左字首匹配原則,非常重要的原則。

(9):盡量選擇區分度高的列作為索引.

(10):索引列不能參與計算,保持列「乾淨」:帶函式的查詢不參與索引。

(11):盡量的擴充套件索引,不要新建索引。

(1):like以%開頭索引無效,當like以&結尾,索引有效。

(2):or語句前後沒有同事使用索引,當且僅當or語句查詢條件的前後列均為索引時,索引生效。

(3):組合索引,使用的不是第一列索引時候,索引失效,即最左匹配規則。

(4):資料型別出現隱式轉換,如varchar不加單引號的時候可能會自動轉換為int型別,這個時候索引失效。

(5):在索引列上使用is null或者 is not null 時候,索引失效,因為索引是不索引空值得。

(6):在索引欄位上使用,not、 <>、!= 、時候是不會使用索引的,對於這樣的處理只會進行全表掃瞄。

(7):對索引字段進行計算操作,函式操作時不會使用索引。

(8):當全表掃瞄速度比索引速度快的時候不會使用索引。

(1):單列索引

1)普通索引:mysql中基本索引型別,沒有什麼限制,允許在定義索引的列中插入重複值和空值,純粹為了查詢資料更快一點。

2)唯一索引:索引列中的值必須是唯一的,但是允許為空值,

3)主鍵索引:是一種特殊的唯一索引,不允許有空值。

(2):組合索引:多個字段組合上建立的索引,只有在查詢條件中使用了這些欄位的左邊欄位時,索引才會被使用,使用組合索引時遵循最左字首集合。

(3):全文索引:只有在myisam引擎上才能使用,只能在char,varchar,text 型別欄位上使用全文索引,介紹了要求,說說什麼是全文索引,就是在一堆文字中,通過其中的某個關鍵字等,就能找到該欄位所屬的記錄行,比如有"你是個靚仔,靚女 ..." 通過靚仔,可能就可以找到該條記錄

(4):空間索引:空間索引是對空間資料型別的字段建立的索引,mysql中的空間資料型別有四種,geometry、point、linestring、polygon。在建立空間索引時,使用spatial關鍵字。要求,引擎為myisam,建立空間索引的列,必須將其宣告為not null。

主鍵索引:alter table `table_name` add primary key ( `column` )

唯一索引:alter table `table_name` add unique ( `column` )

普通索引:alter table `table_name` add index index_name ( `column` )

全文索引:alter table `table_name` add fulltext ( `column`)

多列索引:alter table `table_name` add index index_name ( `column1`, `column2`, `column3` )

索引其實就是一種資料結構,能夠幫助我們快速的檢索資料庫中的資料。
常見的mysql主要有兩種結構:hash索引和b+tree索引,我們使用的是innodb引擎,預設的是b+樹。
因為hash索引底層是雜湊表,雜湊表是一種以key-value儲存資料的結構,所以多個資料在儲存關係上是完全沒有任何順序關係的,所以,對於區間查詢是無法直接通過索引查詢的,就需要全表掃瞄。所以,雜湊索引只適用於等值查詢的場景。而b+樹是一種多路平衡查詢樹,所以他的節點是天然有序的(左子節點小於父節點,父節點小於右子節點),所以對於範圍查詢的時候不需要做全表掃瞄。
1:hash索引適合等值查詢,但是無法進行範圍查詢。

2:hash索引沒辦法利用索引完成排序。

3:hash索引不支援多列聯合索引的最左匹配規則。

4:如果有大量重複健值得情況下,hash索引的效率會很低,因為雜湊碰撞問題。

1:innodb的b+tree可能儲存的是整行資料,也有可能是主鍵的值。
1:整行資料:innodb的b+tree儲存了整行資料的是主鍵索引,也被成為聚湊索引。

2:儲存主鍵的值:成為非主鍵索引,也被稱為非聚湊索引

聚簇索引查詢會更加快些。因為主鍵索引樹的頁子節點儲存的是整行資料。也就是我們需要得到的資料。而非主鍵索引的頁子節點是主鍵的值,查詢的主鍵之後,我們還需要通過主鍵的值再次進行查詢資料。(這個過程被稱之為回表)。
不一定的?因為通過覆蓋索引也可以只查詢一次。
(1):覆蓋索引指的是乙個查詢語句的執行只用從索引中就能獲取到。不必從資料表中讀取。也可以被稱之為索引覆蓋。當一條查詢語句符合覆蓋索引條件時候,mysql只需要通過索引就可以返回查詢所需要的資料。這樣就可以避免回表操作,減少i/o提高效率。

(2):表covering_index_sample中有乙個普通索引 idx_key1_key2(key1,key2)。當我們通過sql語句:

select key2 from covering_index_sample where key1 = 'keytest';的時候,就可以通過覆蓋索引查詢,無需回表。

在建立聯合索引時候,一般需要遵循最左匹配原則。即聯合索引中的屬性識別度最高的放在查詢語句的最前面。
mysql5.6引入了索引下推優化,預設是開啟的。

例子:user表中(a,b,c)構成乙個索引。

select * from user where a='23' and b like '%eqw%' and c like 'dasd'。

解釋:如果沒有索引下推原則,則mysql會通過a='23' 先查詢出乙個對應的資料。然後返回到mysql服務端。mysql服務端再基於兩個like模糊查詢來校驗and查詢出的資料是否符合條件。這個過程就設計到回表操作。

如果使用了索引下推技術,則mysql會首先返回返回條件a='23'的資料的索引,然後根據模糊查詢的條件來校驗索引行資料是否符合條件,如果符合條件,則直接根據索引來定位對應的資料,如果不符合直接reject掉。因此,有了索引下推優化,可以在有like條件的情況下,減少回表的次數。

使用explain查詢sql語句的執行計畫,通過執行計畫來分析索引的使用情況。
1:根據搜尋條件,找出可能使用的索引。

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

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

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

MySQL索引相關面試題

相信很多人對於mysql的索引都不陌生,索引 index 是幫助mysql高效獲取資料的資料結構。因為索引是mysql中比較重點的知識,相信很多人都有一定的了解,尤其是在面試 現的頻率特別高。樓主自認為自己對mysql的索引相關知識有很多了解,而且因為最近在找工作面試,所以單獨複習了很多關於索引的知...

幾道MySQL索引相關的重點面試題

mysql 索引你真的懂嗎?這幾道題帶你了解索引的幾個重要知識點 以下回答全部是基於mysql的innodb引擎 例如對於下面這一張表 如果我們按照 name 欄位來建立索引的話,採用b 樹的結構,大概的索引結構如下 如果我們要進行模糊查詢,查詢name 以 張 開頭的所有人的id,即 sql 語句...

Mysql的相關面試題

liunx設定mysql慢日誌開啟 配置檔案配置檔案 1.編輯配置檔案 vim etc my.conf2.設定慢日誌開啟 slow query log on2.1 設定slow query log 1 則long query time預設情況下記錄慢查詢的時間閾值為10s 即開啟慢查詢日誌,未指定s...