原标题: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系列目录

责任编辑:

java的弱索引是什么_Java从零开始学 - 第76篇:什么是索引?相关推荐

  1. left join 索引失效无条件_从零开始学数据分析-mysql索引优化方案

    接上节,执行计划还有一个重要的字段是extra,以下是出现的选项. 1.using filesort: 需要一次额外的查询或者排序,性能开销大.常见于order by语句中. create 对于单索引 ...

  2. java list 从0开始_Java从零开始学二十一(集合List接口)

    package com.pb.demo1; import java.util.LinkedList; import java.util.List; public class PersonLinkedL ...

  3. Java通过自定义注解执行方法_Java自定义注解(使用篇)

    TL;DR Java 注解广泛运用在开发之中,用于增强变量/方法/类等. 尝试说明 Java 自定义注解的使用,以及通过开源项目中的使用进行说明. 本文主要记录个人的理解,全文基于Java SE8. ...

  4. java开发面试自我介绍模板_java面试自我介绍3篇

    java 面试自我介绍 3 篇 java 面试自我介绍篇一: 我叫赵,我的同学更都喜欢称呼我的英文名字,叫,六月的 意思,是君的谐音.我来自安徽的市,在 21 年我以市全市第一名 的成绩考上了大学, ...

  5. java 下拉复选框_JAVA个人小程序GUI篇-收银(标签、按钮、复选框、下拉标、文本域、表格······)...

    1 //导入包 2 importjava.awt.BorderLayout;3 importjava.awt.EventQueue;4 5 importjavax.swing.JFrame;6 imp ...

  6. 学习笔记(07):Java小白修炼手册-基础语法:从零开始学Java(二)

    立即学习:https://edu.csdn.net/course/play/27274/361057?utm_source=blogtoedu 类和对象的入门 类:是一个模板,是抽象的,它描述一类对象 ...

  7. 从零开始学飞塔第一篇:飞塔防火墙基本上网配置(PPPoE拨号固定IP上网)FortiGate Broadband internet access

    飞塔防火墙基本上网配置一共分三个部分-----接口-----路由-----策略,且防火墙可代替路由器接入互联网.本文参考Aggy梁工的博客,已征得本人同意.首先我们讲的是PPPoE拨号上网的配置,再讲 ...

  8. 从零开始学产品第二篇:关于测试的一切

    第一章 动手设计之前,先学会验收 先放一个镇楼图以示敬意. 其实用磨刀来描述测试,并不算特别的准确,但一时间想不到更好的比喻. 本章用来总述,为什么学产品要先从测试开始,以及产品和测试的关系是什么 怎 ...

  9. 从零开始学Kotlin-类的继承(6)

    从零开始学Kotlin基础篇系列文章 Kotlin中的超类Any Kotlin 中所有类都继承超类 Any 类 class demo6 //默认继承超类Anyclass demo6 : Any() A ...

最新文章

  1. C++中public、protected、private的差别
  2. 动态执行c# 脚本片段
  3. java+character类使用_Java Character类应用实例
  4. android 单元测试 多线程,单元测试多线程Android RxJava
  5. IoU,ROI 和 ROC,AUC区分
  6. 陆正耀为瑞幸数据造假道歉:非常自责 会全力挽回损失
  7. Postman使用总结(1)——Postman 自动化测试小结
  8. hibernate课程 初探单表映射1-2 ORM定义
  9. mysql force_MySQL force Index 强制索引概述
  10. SVN客户端安装与常用操作(超详细)
  11. iOS 10越狱设备终于有越狱移除工具了!
  12. 50道逻辑编程小题目
  13. Linux文件--文件命名规则
  14. G-sensor 介绍
  15. 51CTO学院 oracle相关视频地址
  16. SAP SD 销售中的借贷项凭证
  17. 计算机网络学习——套接字实验(二)
  18. 让dropout在图像超分辨领域大放异彩![2022 CVPR]
  19. 网站带不带www真的不一样,很多新手不知道区别会被坑死的
  20. 设计模式GOF23之-------------------结构型模式(适配器模式、代理模式、桥接模式、装饰模式、组合模式、外观模式、享元模式)

热门文章

  1. java 银行管理系统怎么储存账户信息_银行管理系统 实现用户注册 登录 存、取款 交易记录查询和修改用户信息等功能...
  2. oracle共享内存设置spfile,IPC 资源、kernel.shmmax和Oracle 共享内存的调整
  3. Python+OpenCV:立体图像深度图(Depth Map from Stereo Images)
  4. 批处理脚本:判断进程是否存在
  5. Halcon:标准标定板的自制方法
  6. ssm如何支持热部署_最新Spring Boot实战文档推荐:项目搭建+配置+SSM整合
  7. 惠普谢少毅:网络攻击威胁在线交易
  8. 高质量 Android 开发框架 LoonAndroid 详解
  9. 学习VIM之2014
  10. ant编译mysql驱动