Mysql系列第二十講 什麼是索引?
本文開始連續3篇詳解mysql索引:
第1篇來說說什麼是索引?
第2篇詳解Mysql中索引的原理
第3篇結合索引詳解關鍵字explain
本文為索引第一篇:我們來了解一下什麼是索引?
路人在搞計算機之前,是負責小區建設規劃的,上級領導安排路人負責一個萬人小區建設規劃,並提了一個要求:可以快速透過戶主姓名找到戶主的房子;讓路人出個好的解決方案。
方案
剛開始路人沒什麼經驗,實在想不到什麼好辦法。
路人告訴領導:你可以去敲每戶的門,然後開門之後再去詢問房主姓名,是否和需要找的人姓名一致。
領導一聽鬱悶了:我敲你的頭,1萬戶,我一個個找,找到什麼時候了?你明天不用來上班了。
這裡面涉及到的時間有:走到每戶的門口耗時、敲門等待開門耗時、詢問戶主獲取戶主姓名耗時、將戶主姓名和需要查詢的姓名對比是否一致耗時。
加入要找的人剛好在最後一戶,領導豈不是要瘋掉了,需要重複1萬次上面的操作。
上面是最原始,最耗時的做法,可能要找的人根本不在這個小區,白費力的找了1萬次,豈不是要瘋掉。
方案2
路人靈機一動,想到了一個方案:
給所有的戶主制定一個編號,從1-10000,戶主將戶號貼在自家的門口
路人自己製作了一個戶主和戶號對應的表格,我們叫做:戶主目錄表,共1萬條記錄,如下:
戶主姓名 | 房屋編號 |
---|---|
劉德華 | 00001 |
張學友 | 00002 |
路人 | 00888 |
路人甲java | 10000 |
此時領導要查詢路人甲Java時,過程如下:
按照姓名在戶主目錄表查詢路人甲Java,找到對應的編號:10000
然後從第一戶房子開始找,檢視其門口戶號是否是10000,直到找到為止
路人告訴領導,這個方案比方案1有以下好處:
如果要找的人不在這個小區,透過戶主目錄表就確定,不需要第二步了
步驟2中不需要再去敲每戶的門以及詢問戶主的姓名了,只需對比一下門口的戶號就可以了,比方案1省了不少時間。
領導笑著說,不錯不錯,有進步,不過我找路人甲Java還是需要挨家挨戶看門牌號1萬次啊!。。。。。你再去想想吧,看看是否還有更好的辦法來加快查詢速度。
路人下去了苦思冥想,想出了方案3。
方案3
方案2中第2步最壞的情況還是需要找1萬次。
路人去上海走了一圈,看了那邊小區搞的不錯,很多小區都是搞成一棟一棟的,每棟樓裡面有100戶,路人也決定這麼搞。
路人告訴領導:
將1萬戶劃分為100棟樓,每棟樓有25層,每層有4戶人家,總共1萬戶
給每棟樓一個編號,範圍是[001,100],將棟號貼在每棟樓最顯眼的位置
給每棟樓中的每層一個編號,編號範圍是[01,25],將層號貼在每層樓最顯眼的位置
戶號變為:棟號-樓層-層中編號,如路人甲Java戶號是:100-20-04,貼在每戶門口
戶主目錄表還是有1萬條記錄,如下:
戶主姓名 | 房屋編號 |
---|---|
劉德華 | 001-08-04 |
張學友 | 022-18-01 |
路人 | 088-25-04 |
路人甲java | 100-25-04 |
此時領導要查詢路人甲Java時,過程如下:
按照姓名在戶主目錄表查詢路人甲Java,找到對應的編號是100-25-04,將編號分解,得到:棟號(100)、樓層(25)、樓號(04)
從第一棟開始找,看其棟號是否是100,直到找到編號為100為止,這個過程需要找100次,然後到了第100棟樓下 /oldage/
從100棟的第一層開始向上走,走到每層看其編號是否為25,直到走到第25層,這個過程需要匹配25次
在第25層依次看看戶號是否為100-25-04,匹配了4次,找到了路人甲Java
此方案分析:
查詢戶主目錄表1萬次,不過這個是在表格中,不用動身走路去找,只需要動動眼睛對比一下數字,速度還是比較快的
將方案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 |
姓首字母:L | |
---|---|
姓名 | 戶號 |
劉德華 | 011-16-01 |
路人 | 057-11-04 |
路人甲Java | 048-08-02 |
現在查詢戶號步驟如下:
透過姓名獲取姓對應的首字母
在26個表格中找到對應姓的表格,如路人甲Java,對應L表
在L表中迴圈遍歷,找到路人甲Java的戶號
根據戶號按照方案3中的(2/3/4)步驟找對應的戶主
理想情況:
1萬戶主的姓氏分配比較均衡,那麼每個姓氏下面分配385戶(10000/26) ,那麼找到某個戶主,最多需要:26次+385次 = 410次,相對於1萬次少了很多。
最壞的情況:
1萬個戶主的姓氏都是一樣的,導致這1萬個戶主資訊都位於同一個姓氏戶主表,此時查詢又變為了1萬多次。不過出現姓氏一樣的情況比較低。
如果擔心姓氏不足以均衡劃分戶主資訊,那麼也可以透過戶主姓名的筆畫數來劃分,或者其他方法,主要是將使用者資訊劃分為不同的區,可以快速過濾一些不相關的戶主。
上面幾個方案為了快速檢索到戶主,用到了一些資料結構,透過這些資料結構對戶主的資訊進行組織,從而可以快速過濾掉一些不相關的戶主,減少查詢次數,快速定位到戶主的房子。
索引是什麼?
透過上面的示例,我們可以概況一下索引的定義:索引是依靠某些資料結構和演算法來組織資料,最終引導使用者快速檢索出所需要的資料。
索引有2個特點:
透過資料結構和演算法來對原始的資料進行一些有效的組織
透過這些有效的組織,可以引導使用者對原始資料進行快速檢索
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30239065/viewspace-2726229/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Mysql系列第二十一講 mysql索引原理詳解MySql索引
- Mysql系列第二十二講 mysql索引管理詳解MySql索引
- Mysql系列第二十三講 如何正確的使用索引?MySql索引
- mysql字首索引是什麼MySql索引
- mysql唯一索引是什麼MySql索引
- MySQL索引那些事:什麼是索引?為什麼加索引就查得快了?MySql索引
- Mysql系列第二十四講 聊聊mysql如何實現分散式鎖?MySql分散式
- 為什麼MySQL字串不加引號索引失效?《死磕MySQL系列 十一》MySql字串索引
- Mysql 索引精講MySql索引
- Mysql索引資料結構為什麼是B+樹?MySql索引資料結構
- ElasticSearch 倒排索引(Inverted Index)| 什麼是倒排索引?Elasticsearch索引Index
- MySQL索引系列:全文索引MySql索引
- 五分鐘,讓你明白MySQL是怎麼選擇索引《死磕MySQL系列 六》MySql索引
- mysql為什麼加索引就能快MySql索引
- Spring系列第九講 depend-on到底是幹什麼的?Spring
- MySQL中的索引詳講MySql索引
- FAQ系列|MySQL索引之聚集索引MySql索引
- 簡單講講小程式外掛是什麼
- 什麼是行儲存和列儲存?正排索引和倒排索引?MySQL既不是倒排索引,也索引MySql
- 你來講講AQS是什麼吧?都是怎麼用的?AQS
- Mysql:好好的索引,為什麼要下推?MySql索引
- MySQL實戰 | 為什麼要使用索引?MySql索引
- MySQL索引為什麼使用B+樹?MySql索引
- MYSQL索引為什麼這麼快?瞭解索引的神奇之處MySql索引
- mysql中是什麼意思?MySql
- MySql 什麼是檢視MySql
- 你演講(分享)是為了什麼?
- MySQL實戰45講——普通索引和唯一索引MySql索引
- MySQL系列:索引基本操作(4)MySql索引
- 【MySQL】究竟什麼是MVCC呢?MySqlMVC
- mysql中的“=”是什麼意思MySql
- MySQL的半同步是什麼?MySql
- MYSQL中的COLLATE是什麼?MySql
- 什麼是 DevSecOps?系列(一)dev
- 給女朋友講解什麼是代理模式模式
- MySQL、NoSQL分別是什麼?有什麼區別?MySql
- Mysql系列第二十五講 mysql如何確保資料不丟失?有幾點值得我們借鑑MySql
- 面試題:MySQL索引為什麼用B+樹?面試題MySql索引