mysql索引相關面試題

存儲引擎分類有哪些以及使用場景?

(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):儘量的擴展索引,不要新建索引。

索引失效情況? 校驗SQL語句是否使用了索引方式爲:在SQL語句前面使用explain關鍵字

(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。

linux添加索引

主鍵索引: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+樹。

既然提到了InnoDB使用戶的B+樹的索引模型,那麼你知道爲什麼採用B+樹嗎?這和Hash索引比較起來有什麼缺點嗎?

因爲hash索引底層是哈希表,哈希表是一種以key-value存儲數據的結構,所以多個數據在存儲關係上是完全沒有任何順序關係的,所以,對於區間查詢是無法直接通過索引查詢的,就需要全表掃描。所以,哈希索引只適用於等值查詢的場景。而B+樹是一種多路平衡查詢樹,所以他的節點是天然有序的(左子節點小於父節點,父節點小於右子節點),所以對於範圍查詢的時候不需要做全表掃描。

B+ Tree索引和Hash索引區別?

1:hash索引適合等值查詢,但是無法進行範圍查詢。
2:hash索引沒辦法利用索引完成排序。
3:hash索引不支持多列聯合索引的最左匹配規則。
4:如果有大量重複健值得情況下,hash索引的效率會很低,因爲哈希碰撞問題。

B+Tree的頁子節點都可以存放哪些東西?

1:innoDB的B+Tree可能存儲的是整行數據,也有可能是主鍵的值。

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和mysql5.7對索引做了哪些優化?

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條件的情況下,減少回表的次數。

怎麼查詢SQL語句是否使用了索引查詢?

使用explain查詢SQL語句的執行計劃,通過執行計劃來分析索引的使用情況。

優化器的執行過程?

1:根據搜索條件,找出可能使用的索引。
2:計算全表掃描的代價。
3:計算使用不同索引執行查詢的代價。
4:對比各種執行方案的代價,找出成本最低的一個。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章