Mysql高手系列 - 第21篇:什麼是索引?

Mysql系列的目標是:經過這個系列從入門到全面掌握一個高級開發所須要的所有技能。html

這是Mysql系列第21篇。java

本文開始連續3篇詳解mysql索引:mysql

  1. 第1篇來講說什麼是索引?
  2. 第2篇詳解Mysql中索引的原理
  3. 第3篇結合索引詳解關鍵字explain

本文爲索引第一篇:咱們來了解一下什麼是索引?算法

路人在搞計算機以前,是負責小區建設規劃的,上級領導安排路人負責一個萬人小區建設規劃,並提了一個要求:能夠快速經過戶主姓名找到戶主的房子;讓路人出個好的解決方案。sql

方案1

剛開始路人沒什麼經驗,實在想不到什麼好辦法。微信

路人告訴領導:你能夠去敲每戶的門,而後開門以後再去詢問房主姓名,是否和須要找的人姓名一致。數據結構

領導一聽鬱悶了:我敲你的頭,1萬戶,我一個個找,找到何時了?你明天不用來上班了。數據結構和算法

這裏面涉及到的時間有:走到每戶的門口耗時、敲門等待開門耗時、詢問戶主獲取戶主姓名耗時、將戶主姓名和須要查找的姓名對比是否一致耗時。函數

加入要找的人恰好在最後一戶,領導豈不是要瘋掉了,須要重複1萬次上面的操做。mysql索引

上面是最原始,最耗時的作法,可能要找的人根本不在這個小區,白費力的找了1萬次,豈不是要瘋掉。

方案2

路人靈機一動,想到了一個方案:

  1. 給全部的戶主制定一個編號,從1-10000,戶主將戶號貼在自家的門口
  2. 路人本身製做了一個戶主和戶號對應的表格,咱們叫作:戶主目錄表,共1萬條記錄,以下:
戶主姓名 房屋編號
劉德華 00001
張學友 00002
路人 00888
路人甲java 10000

此時領導要查找路人甲Java時,過程以下:

  1. 按照姓名在戶主目錄表查找路人甲Java,找到對應的編號:10000
  2. 而後從第一戶房子開始找,查看其門口戶號是不是10000,直到找到爲止

路人告訴領導,這個方案比方案1有如下好處:

  1. 若是要找的人不在這個小區,經過戶主目錄表就肯定,不須要第二步了
  2. 步驟2中不須要再去敲每戶的門以及詢問戶主的姓名了,只需對比一下門口的戶號就能夠了,比方案1省了很多時間。

領導笑着說,不錯不錯,有進步,不過我找路人甲Java仍是須要挨家挨戶看門牌號1萬次啊!。。。。。你再去想一想吧,看看是否還有更好的辦法來加快查找速度。

路人下去了苦思冥想,想出了方案3。

方案3

方案2中第2步最壞的狀況仍是須要找1萬次。

路人去上海走了一圈,看了那邊小區搞的不錯,不少小區都是搞成一棟一棟的,每棟樓裏面有100戶,路人也決定這麼搞。

路人告訴領導:

  1. 將1萬戶劃分爲100棟樓,每棟樓有25層,每層有4戶人家,總共1萬戶

  2. 給每棟樓一個編號,範圍是[001,100],將棟號貼在每棟樓最顯眼的位置

  3. 給每棟樓中的每層一個編號,編號範圍是[01,25],將層號貼在每層樓最顯眼的位置

  4. 戶號變爲:棟號-樓層-層中編號,如路人甲Java戶號是:100-20-04,貼在每戶門口

戶主目錄表仍是有1萬條記錄,以下:

戶主姓名 房屋編號
劉德華 001-08-04
張學友 022-18-01
路人 088-25-04
路人甲java 100-25-04

此時領導要查找路人甲Java時,過程以下:

  1. 按照姓名在戶主目錄表查找路人甲Java,找到對應的編號是100-25-04,將編號分解,獲得:棟號(100)、樓層(25)、樓號(04)
  2. 從第一棟開始找,看其棟號是不是100,直到找到編號爲100爲止,這個過程須要找100次,而後到了第100棟樓下
  3. 從100棟的第一層開始向上走,走到每層看其編號是否爲25,直到走到第25層,這個過程須要匹配25次
  4. 在第25層依次看看戶號是否爲100-25-04,匹配了4次,找到了路人甲Java

此方案分析:

  1. 查找戶主目錄表1萬次,不過這個是在表格中,不用動身走路去找,只須要動動眼睛對比一下數字,速度仍是比較快的
  2. 將方案2中的第2步優化爲上面的2/3/4步驟,上面最壞須要匹配129次(棟100+層25+樓號4次),相對於方案2的1萬次好多了

領導拍拍路人的肩膀:小夥子,去過上海的人確實不同啊,此次方案不錯,不過第一步仍是須要不少次,可否有更好的方案呢?

路人下去了又想了好幾天,忽然想到了咱們經常使用的字典,能夠按照字典的方式對方案3中第一步作優化,而後提出了方案4。

方案4

對戶主表進行改造,按照姓的首字母(a-z)製做26個表格,叫作:姓氏戶主表,每一個表格中保存對應姓氏首字母及全部戶主和戶號。以下:

姓首字母:A
姓名 戶號
阿三 010-16-01
阿郎 017-11-04
啊啊 008-08-02

<br/>

姓首字母:L
姓名 戶號
劉德華 011-16-01
路人 057-11-04
路人甲 048-08-02

如今查找戶號步驟以下:

  1. 經過姓名獲取姓對應的首字母
  2. 在26個表格中找到對應姓的表格,如路人甲Java,對應L表
  3. 在L表中循環遍歷,找到路人甲Java的戶號
  4. 根據戶號按照方案3中的(2/3/4)步驟找對應的戶主

理想狀況:

1萬戶主的姓氏分配比較均衡,那麼每一個姓氏下面分配385戶(10000/26) ,那麼找到某個戶主,最多須要:26次+385次 = 410次,相對於1萬次少了不少。

最壞的狀況:

1萬個戶主的姓氏都是同樣的,致使這1萬個戶主信息都位於同一個姓氏戶主表,此時查詢又變爲了1萬屢次。不過出現姓氏同樣的狀況比較低。

若是擔憂姓氏不足以均衡劃分戶主信息,那麼也能夠經過戶主姓名的筆畫數來劃分,或者其餘方法,主要是將用戶信息劃分爲不一樣的區,能夠快速過濾一些不相關的戶主。

上面幾個方案爲了快速檢索到戶主,用到了一些數據結構,經過這些數據結構對戶主的信息進行組織,從而能夠快速過濾掉一些不相關的戶主,減小查找次數,快速定位到戶主的房子。

索引是什麼?

經過上面的示例,咱們能夠概況一下索引的定義:索引是依靠某些數據結構和算法來組織數據,最終引導用戶快速檢索出所須要的數據。

索引有2個特色:

  1. 經過數據結構和算法來對原始的數據進行一些有效的組織
  2. 經過這些有效的組織,能夠引導使用者對原始數據進行快速檢索

mysql爲了快速檢索數據,也用到了一些好的數據結構和算法,來組織表中的數據,加快檢索效率。

下篇文章將對mysql索引原理作詳細介紹,敬請期待,喜歡的關注一下謝謝!

Mysql系列目錄

  1. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933257&idx=1&sn=0f0086a2465a2fcae13d3fea65064803&chksm=88621bb7bf1592a1ac94fe4107ba1ef26a0fa97e1bf9aea7279009d8bd240f1ef7d27aa10393&token=1876080189&lang=zh_CN#rd">第1篇:mysql基礎知識</a>
  2. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933270&idx=1&sn=409080e17352da2035b0bfdf63ccdfde&chksm=88621ba8bf1592beb2ef6106d6bf9f3eccd48d6814c7031f36e3c8be68821f17cf065129688c&token=1876080189&lang=zh_CN#rd"> 第2篇:詳解mysql數據類型(重點)</a>
  3. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933279&idx=1&sn=f8591b95362cb3c352d895b1289d665a&chksm=88621ba1bf1592b72a43a62e3f310695e8b87f17932d052145622c3edbb70ef8cb987849fc3e&token=516655478&lang=zh_CN#rd"> 第3篇:管理員必備技能(必須掌握)</a>
  4. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933289&idx=1&sn=c4f212c312ea86e08ad322caddd05e38&chksm=88621b97bf159281156ee3be510a1a15234531d2c97d66957e67377829ab23779809ea55bbde&token=1484565200&lang=zh_CN#rd"> 第4篇:DDL常見操做</a>
  5. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933296&idx=1&sn=1c56256d60c5847a944d87c8cfc9c14d&chksm=88621b8ebf159298b0789e2994d2aaf8b582effc7d8c1ba715deaca11c86a9dc8ac730878dc0&token=2000571846&lang=zh_CN#rd"> 第5篇:DML操做彙總(insert,update,delete)</a>
  6. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933300&idx=1&sn=bedef4d430dc76141e42e42ef6acfaa6&chksm=88621b8abf15929caae7904019c946a396885a33855ca465bacdd4187538005ebc3c116888f5&token=1814800041&lang=zh_CN#rd"> 第6篇:select查詢基礎篇</a>
  7. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933305&idx=1&sn=2c5ba0bea6fcdd57d86cecd63541f91a&chksm=88621b87bf1592915086c1e945119fcc95af6aa1127b90ef1b56b018083bfd787ad95efde918&token=1144227002&lang=zh_CN#rd"> 第7篇:玩轉select條件查詢,避免採坑</a>
  8. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933309&idx=1&sn=0f7dfec8bc70e67daa7159ee219325b8&chksm=88621b83bf1592951d949179061f39a1f4266b2879bc9a25af4da3b4b29f69ab1fcc595a462f&token=516674265&lang=zh_CN#rd"> 第8篇:詳解排序和分頁(order by & limit)</a>
  9. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933315&idx=1&sn=4abf2b34a53a85cbd4a3b9ee31fcd398&chksm=88621bfdbf1592eb6a5a13202588dde9068ac7e6391d8dbf3fde33647bf0e044839ba4228216&token=1937580929&lang=zh_CN#rd"> 第9篇:分組查詢詳解(group by & having)</a>
  10. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933321&idx=1&sn=110f6cacb90845bf2327fbcd7acd708c&chksm=88621bf7bf1592e1f1c0f2f01e40d4bd63a48d98daa4ba1157ecad4c6c6520d18b4b2c24c906&token=1096041061&lang=zh_CN#rd"> 第10篇:經常使用的幾十個函數詳解</a>
  11. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933325&idx=1&sn=33274227db275a3570e1e43ccdd4f49c&chksm=88621bf3bf1592e5b75f537e21961c4295fafb782dbf31c0c1cbf9e36f5f4ed44d31cdad68b3&token=1832579722&lang=zh_CN#rd"> 第11篇:深刻了解鏈接查詢及原理</a>
  12. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933342&idx=2&sn=2e41daa0926a9c32d5fddd23590391aa&chksm=88621be0bf1592f66904a184858df7c11129e8b545c7626b8b6c1fcc32d3dfdd9ab21aeda8e5&token=386795745&lang=zh_CN#rd"> 第12篇:子查詢</a>
  13. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933349&idx=1&sn=6e81f9046119cda43f8eb602d1139ef0&chksm=88621bdbbf1592cd9a20ec4715fe9f9459d079b641b04f607999c106cd52453d8c8508d939d7&token=386795745&lang=zh_CN#rd"> 第13篇:細說NULL致使的神坑,讓人防不勝防</a>
  14. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933355&idx=1&sn=b426ad28dfc2a64bba813df5b7c341a4&chksm=88621bd5bf1592c3c08e441398f699d0a4c2303a51519aac169447f22765cc613dfc3d991f8b&token=385335213&lang=zh_CN#rd"> 第14篇:詳解事務</a>
  15. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933370&idx=1&sn=4fe9b8e2aba766988c503737d34d9836&chksm=88621bc4bf1592d2b06d659884bf9881bd207a042ac36176f12808bd72f235e8e3404366259e&token=84059034&lang=zh_CN#rd"> 第15篇:詳解視圖</a>
  16. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933374&idx=1&sn=c294b6a69564a4c98d4c0cb29aeb9ac0&chksm=88621bc0bf1592d650752c44ca50540c1fa0c88c0a514019f1317559e13098de7dac37ddfc05&token=1531009350&lang=zh_CN#rd"> 第16篇:變量詳解</a>
  17. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933382&idx=1&sn=4cf80b4f50c80dcc8171d2128b47cf63&chksm=88621c38bf15952e193177a0ba3e03beeaeed996553ce6900f91518310332e99c915e8be2566&token=1341741305&lang=zh_CN#rd"> 第17篇:存儲過程&自定義函數詳解</a>
  18. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933388&idx=1&sn=59cb1d23845e45894bb72c1e2479f074&chksm=88621c32bf1595241573e4194912ca60a51eb8477f4b49492e26668c9bebc032e9d6672e7fdd&token=1832749573&lang=zh_CN#rd"> 第18篇:流程控制語句</a>
  19. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933392&idx=1&sn=ff29e380b42a0aa7cb1dc7659d745686&chksm=88621c2ebf1595380f99d9c4c89581638a27a5cf356de35d31aa9ae7ac17e63abe0e4adc813c&token=1479782197&lang=zh_CN#rd"> 第19篇:遊標詳解</a>
  20. <a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933396&idx=1&sn=b6cc5d5287bf43d94e6706fa217aa8cb&chksm=88621c2abf15953c3200c6d4d945ad70bdd2177f020f8e2229ae269153bbc8bf251af83e1135&token=1846211483&lang=zh_CN#rd"> 第20篇:異常捕獲及處理詳解</a>

mysql系列大概有20多篇,喜歡的請關注一下,歡迎你們加我微信itsoku或者留言交流mysql相關技術!

原文出處:https://www.cnblogs.com/itsoku123/p/11636079.html

相關文章
相關標籤/搜索