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:對比各類執行方案的代價,找出成本最低的一個。
複製代碼
相關文章
相關標籤/搜索