1、什么是索引?
索引是幫助MySQL高效獲取數據的數據結構(有序)。
在數據之外,數據庫系統還維護着滿足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就可以在這些數據結構上實現高級查找算法,這種數據結構就是索引。
圖示:
索引本身也很大,一般以索引文件的形式存在磁盤上。
2、說一下索引有哪些優勢有哪些劣勢?
優勢:
1、提高數據的查詢效率,降低了數據庫的IO成本;
2、通過索引列對數據進行排序,可以大大降低排序的成本,即降低了CPU的消耗。
劣勢:
1、實際上索引也是一張表,該表中保存了主鍵和索引字段,並指向實體表的記錄,所以索引列也是要占用空間的;
2、雖然索引大大提高了查詢效率,但同時也降低了更新表的速度,如對表進行insert,update,delete。因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件。每次更新或添加了索引列的字段,都會調整因為更新所帶來的鍵值變化后的索引信息。
3、介紹一下索引的數據結構?
索引是在MySQL的引擎層中實現的,所以每種存儲引擎的索引都不一定完全相同,也不是所有的存儲引擎都支持所有的索引類型。
MySQL目前提供了以下四種結構的索引:
1、BTREE索引:最常見的索引類型,大部分索引都支持B樹索引。
2、HASH索引(了解):只有Memory引擎支持,適用場景簡單。
3、R-TREE索引(了解):即空間索引,是MyISAM引擎的一個特殊索引類型,主要用於地理空間數據類型。
4、Full-text索引(了解):即全文索引,也是MyISAM引擎的一個特殊索引類型,主要用於全文檢索,InnoDB從MySQL5.6開始支持全文檢索。
我們平常所說的索引,如果沒有特別指明,都指的是B+樹索引。其中InnoDB引擎,默認使用的就是B+樹結構的索引。
4、BTREE索引的檢索原理
初始化簡介:
一顆B+樹,淺藍色的塊我們稱之為一個磁盤塊,每個磁盤塊包含幾個數據項(深藍色)和指針(黃色);
如:磁盤塊1包含數據項17和35,包含指針P1,P2,P3;
P1表示小於17的磁盤塊,P2表示在17和35之間的磁盤塊,P3表示大於35的磁盤塊;
真實的數據只存在於葉子節點,即:3、5、9、10、13、15、28、29、36、60、75、79、90、99;
非葉子節點不存儲真實的數據,只存儲指引搜索方向的數據項,如:17、35並不真實存在於數據表中。
查找過程:
如果要查找數據項29,那么首先會把磁盤塊1由磁盤加載到內存,此時發生一次IO,在內存中用二分查找確定29在17和35之間,鎖定磁盤塊1的P2指針;
通過磁盤塊1的P2指針的磁盤地址把磁盤塊3由磁盤加載到內存,發生第二次IO,29在26和30之間,鎖定磁盤塊3的P2指針;
通過磁盤塊3的P2指針的磁盤地址把磁盤塊8由磁盤加載到內存,發生第三次IO,同時內存中做二分查找找到29,結束查詢,共計3次IO。
總結:
真實的情況是,3層的B+樹可以表示上百萬的數據,如果上百萬的數據查找只需要3次IO,性能提高將是巨大的;
如果沒有索引,每個數據項都要發生一次IO,那么總共需要百萬次的IO,成本非常高。
5、索引分為哪些類型?
單值索引:即一個索引只包含單個列,一個表可以有多個單列索引。
唯一索引:索引列的值必須唯一,但允許有空值。
復合索引:即一個索引包含多個列。
6、索引的基本語法?
1、創建索引:
方式1:
create [UNIQUE] index 索引名 on 表名(字段名...);
示例:create [UNIQUE] index idx_city_name on city(city_name);
方式2:
alter table 表名 add index 索引名(字段名...)
示例:alter table city add index idx_city_name(city_name);
2、查看索引:
show index from 表名;
示例:show index from city;
3、刪除索引:
drop index 索引名 on 表名;
示例:drop index idx_city_name on city;
7、哪些情況需要創建索引?
1、主鍵自動建立唯一索引
2、頻繁作為查詢條件的字段應創建索引
3、查詢中與其它表關聯的字段,外鍵關系建立索引
4、查詢中排序的字段,排序字段若通過索引去訪問將大大提高排序速度
5、查詢中統計或分組字段
8、哪些情況不需要創建索引?
1、數據量太少
2、經常做增刪改頻繁操作的的字段
3、數據重復且分布平均的表字段
解釋:假如一個表有10萬記錄,有一個字段只有true和false兩種值,且每個值的分布概率大約為50%,那么這個對該字段建索引不會提高查詢效率;
索引的選擇性:索引列中不同的值的數目/表記錄數
如果一個表中有2000條數據,索引列有1980個不同的值,那么這個索引的選擇性就是1980/2000=0.99,選擇性越接近1,索引的效率越高。
4、where條件里用不到的字段