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條件里用不到的欄位
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/380841.html
標籤:其他
上一篇:navicat~匯出資料庫密碼
