多關於索引,分爲如下幾點來說解:mysql
1、索引的概述(什麼是索引,索引的優缺點)程序員
2、索引的基本使用(建立索引)面試
3、索引的基本原理(面試重點)算法
4、索引的數據結構(B樹,hash)sql
5、建立索引的原則(重中之重,面試必問!敬請收藏!)數據庫
6、百萬級別或以上的數據如何刪除數據結構
1)什麼是索引?性能
索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),它們包含着對數據表裏全部記錄的引用指針。更通俗的說,索引就至關於目錄。當你在用新華字典時,幫你把目錄撕掉了,你查詢某個字開頭的成語只能從第一頁翻到第一千頁。累!把目錄還給你,則能快速定位!優化
2)索引的優缺點:指針
能夠大大加快數據的檢索速度,這也是建立索引的最主要的緣由。,且經過使用索引,能夠在查詢的過程當中,使用優化隱藏器,提升系統的性能。可是,索引也是有缺點的:索引須要額外的維護成本;由於索引文件是單獨存在的文件,對數據的增長,修改,刪除,都會產生額外的對索引文件的操做,這些操做須要消耗額外的IO,會下降增/改/刪的執行效率。
1)建立索引:(三種方式)
第一種方式:
第二種方式:使用ALTER TABLE命令去增長索引:
ALTER TABLE用來建立普通索引、UNIQUE索引或PRIMARY KEY索引。
其中table_name是要增長索引的表名,column_list指出對哪些列進行索引,多列時各列之間用逗號分隔。
索引名index_name可本身命名,缺省時,MySQL將根據第一個索引列賦一個名稱。另外,ALTER TABLE容許在單個語句中更改多個表,所以能夠在同時建立多個索引。
第三種方式:使用CREATE INDEX命令建立
CREATE INDEX可對錶增長普通索引或UNIQUE索引。(可是,不能建立PRIMARY KEY索引)
索引用來快速地尋找那些具備特定值的記錄。若是沒有索引,通常來講執行查詢時遍歷整張表。
索引的原理很簡單,就是把無序的數據變成有序的查詢
一、把建立了索引的列的內容進行排序
二、對排序結果生成倒排表
三、在倒排表內容上拼上數據地址鏈
四、在查詢的時候,先拿到倒排表內容,再取出數據地址鏈,從而拿到具體數據
1)B樹索引
mysql經過存儲引擎取數據,基本上90%的人用的就是InnoDB了,按照實現方式分,InnoDB的索引類型目前只有兩種:BTREE(B樹)索引和HASH索引。B樹索引是Mysql數據庫中使用最頻繁的索引類型,基本全部存儲引擎都支持BTree索引。一般咱們說的索引不出意外指的就是(B樹)索引(實際是用B+樹實現的,由於在查看錶索引時,mysql一概打印BTREE,因此簡稱爲B樹索引)
查詢方式:
主鍵索引區:PI(關聯保存的時數據的地址)按主鍵查詢,
普通索引區:si(關聯的id的地址,而後再到達上面的地址)。因此按主鍵查詢,速度最快
B+tree性質:
1.)n棵子tree的節點包含n個關鍵字,不用來保存數據而是保存數據的索引。
2.)全部的葉子結點中包含了所有關鍵字的信息,及指向含這些關鍵字記錄的指針,且葉子結點自己依關鍵字的大小自小而大順序連接。
3.)全部的非終端結點能夠當作是索引部分,結點中僅含其子樹中的最大(或最小)關鍵字。
4.)B+ 樹中,數據對象的插入和刪除僅在葉節點上進行。
5.)B+樹有2個頭指針,一個是樹的根節點,一個是最小關鍵碼的葉節點。
2)哈希索引
簡要說下,相似於數據結構中簡單實現的HASH表(散列表)同樣,當咱們在mysql中用哈希索引時,主要就是經過Hash算法(常見的Hash算法有直接定址法、平方取中法、摺疊法、除數取餘法、隨機數法),將數據庫字段數據轉換成定長的Hash值,與這條數據的行指針一併存入Hash表的對應位置;若是發生Hash碰撞(兩個不一樣關鍵字的Hash值相同),則在對應Hash鍵下以鏈表形式存儲。固然這只是簡略模擬圖。
索引雖好,但也不是無限制的使用,最好符合一下幾個原則
1) 最左前綴匹配原則,組合索引很是重要的原則,mysql會一直向右匹配直到遇到範圍查詢(>、<、between、like)就中止匹配,好比a = 1 and b = 2 and c > 3 and d = 4 若是創建(a,b,c,d)順序的索引,d是用不到索引的,若是創建(a,b,d,c)的索引則均可以用到,a,b,d的順序能夠任意調整。
2)較頻繁做爲查詢條件的字段纔去建立索引
3)更新頻繁字段不適合建立索引
4)如果不能有效區分數據的列不適合作索引列(如性別,男女未知,最多也就三種,區分度實在過低)
5)儘可能的擴展索引,不要新建索引。好比表中已經有a的索引,如今要加(a,b)的索引,那麼只須要修改原來的索引便可。
6)定義有外鍵的數據列必定要創建索引。
7)對於那些查詢中不多涉及的列,重複值比較多的列不要創建索引。
8)對於定義爲text、image和bit的數據類型的列不要創建索引。
關於索引:因爲索引須要額外的維護成本,由於索引文件是單獨存在的文件,因此當咱們對數據的增長,修改,刪除,都會產生額外的對索引文件的操做,這些操做須要消耗額外的IO,會下降增/改/刪的執行效率。因此,在咱們刪除數據庫百萬級別數據的時候,查詢MySQL官方手冊得知刪除數據的速度和建立的索引數量是成正比的。