天天看點

吐血總結——90%程式員面試都用得上的索引優化手冊目錄一、索引的概述二、索引的基本使用三、索引的基本原理四、索引的資料結構五、建立索引的原則六、百萬級别或以上的資料如何删除讀者福利:

吐血總結——90%程式員面試都用得上的索引優化手冊目錄一、索引的概述二、索引的基本使用三、索引的基本原理四、索引的資料結構五、建立索引的原則六、百萬級别或以上的資料如何删除讀者福利:

目錄

多關于索引,分為以下幾點來講解:

  • 一、索引的概述(什麼是索引,索引的優缺點)
  • 二、索引的基本使用(建立索引)
  • 三、索引的基本原理(面試重點)
  • 四、索引的資料結構(B樹,hash)
  • 五、建立索引的原則(重中之重,面試必問!敬請收藏!)
  • 六、百萬級别或以上的資料如何删除

一、索引的概述

Ⅰ、什麼是索引?

索引是一種特殊的檔案(InnoDB資料表上的索引是表空間的一個組成部分),它們包含着對資料表裡所有記錄的引用指針。更通俗的說,索引就相當于目錄。當你在用新華字典時,幫你把目錄撕掉了,你查詢某個字開頭的成語隻能從第一頁翻到第一千頁。累!把目錄還給你,則能快速定位!

Ⅱ、索引的優缺點:

可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。,且通過使用索引,可以在查詢的過程中,使用優化隐藏器,提高系統的性能。但是,索引也是有缺點的:索引需要額外的維護成本;因為索引檔案是單獨存在的檔案,對資料的增加,修改,删除,都會産生額外的對索引檔案的操作,這些操作需要消耗額外的IO,會降低增/改/删的執行效率。

二、索引的基本使用

建立索引:(三種方式)

第一種方式:

吐血總結——90%程式員面試都用得上的索引優化手冊目錄一、索引的概述二、索引的基本使用三、索引的基本原理四、索引的資料結構五、建立索引的原則六、百萬級别或以上的資料如何删除讀者福利:

第二種方式:使用ALTER TABLE指令去增加索引:

ALTER TABLE用來建立普通索引、UNIQUE索引或PRIMARY KEY索引。

吐血總結——90%程式員面試都用得上的索引優化手冊目錄一、索引的概述二、索引的基本使用三、索引的基本原理四、索引的資料結構五、建立索引的原則六、百萬級别或以上的資料如何删除讀者福利:

其中table_name是要增加索引的表名,column_list指出對哪些列進行索引,多列時各列之間用逗号分隔。

索引名index_name可自己命名,預設時,MySQL将根據第一個索引列賦一個名稱。另外,ALTER TABLE允許在單個語句中更改多個表,是以可以在同時建立多個索引。

第三種方式:使用CREATE INDEX指令建立

CREATE INDEX可對表增加普通索引或UNIQUE索引。(但是,不能建立PRIMARY KEY索引)

吐血總結——90%程式員面試都用得上的索引優化手冊目錄一、索引的概述二、索引的基本使用三、索引的基本原理四、索引的資料結構五、建立索引的原則六、百萬級别或以上的資料如何删除讀者福利:

三、索引的基本原理

索引用來快速地尋找那些具有特定值的記錄。如果沒有索引,一般來說執行查詢時周遊整張表。

索引的原理很簡單,就是把無序的資料變成有序的查詢

  1. 把建立了索引的列的内容進行排序
  2. 對排序結果生成倒排表
  3. 在倒排表内容上拼上資料位址鍊
  4. 在查詢的時候,先拿到倒排表内容,再取出資料位址鍊,進而拿到具體資料

四、索引的資料結構

  • b樹
  • hash

Ⅰ.B樹索引

mysql通過存儲引擎取資料,基本上90%的人用的就是InnoDB了,按照實作方式分,InnoDB的索引類型目前隻有兩種:BTREE(B樹)索引和HASH索引。B樹索引是Mysql資料庫中使用最頻繁的索引類型,基本所有存儲引擎都支援BTree索引。通常我們說的索引不出意外指的就是(B樹)索引(實際是用B+樹實作的,因為在檢視表索引時,mysql一律列印BTREE,是以簡稱為B樹索引)

吐血總結——90%程式員面試都用得上的索引優化手冊目錄一、索引的概述二、索引的基本使用三、索引的基本原理四、索引的資料結構五、建立索引的原則六、百萬級别或以上的資料如何删除讀者福利:

查詢方式:

主鍵索引區:PI(關聯儲存的時資料的位址)按主鍵查詢,

普通索引區:si(關聯的id的位址,然後再到達上面的位址)。是以按主鍵查詢,速度最快

B+tree性質:

  1. n棵子tree的節點包含n個關鍵字,不用來儲存資料而是儲存資料的索引。
  2. 所有的葉子結點中包含了全部關鍵字的資訊,及指向含這些關鍵字記錄的指針,且葉子結點本身依關鍵字的大小自小而大順序連結。
  3. 所有的非終端結點可以看成是索引部分,結點中僅含其子樹中的最大(或最小)關鍵字。
  4. B+ 樹中,資料對象的插入和删除僅在葉節點上進行。
  5. B+樹有2個頭指針,一個是樹的根節點,一個是最小關鍵碼的葉節點。

Ⅱ.哈希索引

簡要說下,類似于資料結構中簡單實作的HASH表(散清單)一樣,當我們在mysql中用哈希索引時,主要就是通過Hash算法(常見的Hash算法有直接定址法、平方取中法、折疊法、除數取餘法、随機數法),将資料庫字段資料轉換成定長的Hash值,與這條資料的行指針一并存入Hash表的對應位置;如果發生Hash碰撞(兩個不同關鍵字的Hash值相同),則在對應Hash鍵下以連結清單形式存儲。當然這隻是簡略模拟圖。

吐血總結——90%程式員面試都用得上的索引優化手冊目錄一、索引的概述二、索引的基本使用三、索引的基本原理四、索引的資料結構五、建立索引的原則六、百萬級别或以上的資料如何删除讀者福利:

五、建立索引的原則

索引雖好,但也不是無限制的使用,最好符合一下幾個原則:

  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官方手冊得知删除資料的速度和建立的索引數量是成正比的。

  1. 是以我們想要删除百萬資料的時候可以先删除索引(此時大概耗時三分多鐘)
  2. 然後删除其中無用資料(此過程需要不到兩分鐘)
  3. 删除完成後重新建立索引(此時資料較少了)建立索引也非常快,約十分鐘左右。
  4. 與之前的直接删除絕對是要快速很多,更别說萬一删除中斷,一切删除會復原。那更是坑了。

讀者福利:

分享免費學習資料

針對于Java程式員,我這邊準備免費的Java架構學習資料(裡面有高可用、高并發、高性能及分布式、Jvm性能調優、MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)

為什麼某些人會一直比你優秀,是因為他本身就很優秀還一直在持續努力變得更優秀,而你是不是還在滿足于現狀内心在竊喜!希望讀到這的您能點個小贊和關注下我,以後還會更新技術幹貨,謝謝您的支援!

資料領取方式:加入Java技術交流群

963944895

,點選加入群聊,私信管理者即可免費領取

怎麼提高代碼品質?——來自阿裡P8架構師的研發經驗總結

阿裡P8分享Java架構師的學習路線,第六點尤為重要

每個Java開發者應該知道的八個工具

想面試Java架構師?這些最基本的東西你都會了嗎?

畫個圖來找你的核心競争力,變中年危機為加油站

哪有什麼中年危機,不過是把定目标當成了有計劃

被裁員不是寒冬重點,重點是怎麼破解職業瓶頸