MySQL索引詳解,面試必問


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條件里用不到的字段


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM