MySql之---索引
由於索引問題經常在面試中問到,今天對索引進行一個系統的總結。
一、是什麼?
索引是對資料庫表中一列或多列的值進行排序的一種結構。是一個單獨的、儲存在磁碟上的資料庫結構,包含著對資料庫表裡所有記錄的引用指標。
二、優缺點
優點:
通過建立唯一索引,可以保證資料庫表中每一行資料的唯一性
大大加快了查詢速度
在使用分組和排序子句進行資料查詢時,可以減少查詢中分組和排序的時間
缺點:
建立和維護索引需要耗費時間
索引佔用額外的儲存空間
降低了插入、刪除、更新的效率
三、分類
1、普通索引和唯一索引
普通索引:允許在定義索引列中插入重複值和空值
唯一索引:允許有空值,但值必須唯一 【主鍵索引不允許有空值】
2、單列索引和組合索引
單列索引:一個索引只包含單列
組合索引:表中多個欄位組合上建立的索引,遵循最左字首集合
3、全文索引
定義:在定義索引的列上支援值的全文查詢,允許插入重複值和空值
適用範圍:希望通過關鍵字的匹配來進行查詢過濾,那麼就需要基於相似度的查詢,而不是原來的精確數值比較。
在使用全文索引的時候有幾個注意事項:
- 所包含的值的個數必須大於4個
- 所包含的值的長度必須大於4個(最小搜尋長度)
4、空間索引
對空間型別的欄位建立的索引
空間型別:geometry、point、linestring、polygon
四、設計原則
1、並非越多越好:一個表中有大量索引不僅佔用較大的磁碟空間,還會影響插入、刪除、更新的效能
2、避免對經常更新的表進行過多的索引,並且索引中的列儘可能小
3、資料量小的表最好不要使用索引:查詢花費的時間可能比遍歷索引的時間還要短
4、在頻繁進行排序或分組的列上建立索引
5、當唯一性是某種資料本身的特徵時,指定唯一索引
五、面試中問到的一些問題
1、聚簇索引與非聚簇索引的區別
(1)聚簇索引:並不是一種單獨的索引型別,而是一種資料儲存方式(B+樹),將資料儲存與索引放到了一塊,找到索引也就找到了資料。
(2)非聚簇索引:其葉子節點並不包含行記錄的全部資料,除了包含鍵值外,還包含了相應行資料的聚簇索引鍵。
2、組合索引的最左字首
首先根據組合索引中最左邊的、也就是第一個欄位進行排序,在第一個欄位排序的基礎上,再對組合索引中後面的第二個欄位進行排序,依此類推。
特性:
對於聯合索引,MySQL 會一直向右匹配直到遇到範圍查詢(> , < ,between,like)就停止匹配。比如 a = 3 and b = 4 and c > 5 and d = 6,如果建立的是(a,b,c,d)這種順序的索引,那麼 d 是用不到索引的,但是如果建立的是 (a,b,d,c)這種順序的索引的話,那麼就沒問題,因為範圍查詢c是最後一個。
= 和 in 可以亂序,比如 a = 3 and b = 4 and c = 5 建立 (a,b,c)索引可以任意順序。
如果建立的索引順序是 (a,b)那麼直接採用 where b = 5 這種查詢條件是無法利用到索引的。