java的弱索引是什么_Java從零開始學 - 第76篇:什么是索引?

 2023-11-11 阅读 26 评论 0

摘要:原標題:Java從零開始學 - 第76篇:什么是索引?關注 我們有助于升職加薪噢!設為“星標”,和你一起掌握更多數據庫知識這是Mysql系列第21篇。本文開始連續3篇詳解mysql索引:第1篇來說說什么是索引?第2篇詳解Mysql中索引的原理第

原標題:Java從零開始學 - 第76篇:什么是索引?

關注 我們有助于升職加薪噢!

設為“星標”,和你一起掌握更多數據庫知識

這是Mysql系列第21篇。

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

第1篇來說說什么是索引?

第2篇詳解Mysql中索引的原理

第3篇結合索引詳解關鍵字explain

本文為索引第一篇:我們來了解一下什么是索引?

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

方案1

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

路人告訴領導:你可以去敲每戶的門,然后開門之后再去詢問房主姓名,是否和需要找的人姓名一致。

領導一聽郁悶了:我敲你的頭,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棟樓下

從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個特點:

通過數據結構和算法來對原始的數據進行一些有效的組織

通過這些有效的組織,可以引導使用者對原始數據進行快速檢索

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

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

Mysql系列目錄

責任編輯:

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/171077.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息