java的弱索引是什么_Java从零开始学 - 第76篇:什么是索引?
原标题: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篇:什么是索引?相关推荐
- left join 索引失效无条件_从零开始学数据分析-mysql索引优化方案
接上节,执行计划还有一个重要的字段是extra,以下是出现的选项. 1.using filesort: 需要一次额外的查询或者排序,性能开销大.常见于order by语句中. create 对于单索引 ...
- java list 从0开始_Java从零开始学二十一(集合List接口)
package com.pb.demo1; import java.util.LinkedList; import java.util.List; public class PersonLinkedL ...
- Java通过自定义注解执行方法_Java自定义注解(使用篇)
TL;DR Java 注解广泛运用在开发之中,用于增强变量/方法/类等. 尝试说明 Java 自定义注解的使用,以及通过开源项目中的使用进行说明. 本文主要记录个人的理解,全文基于Java SE8. ...
- java开发面试自我介绍模板_java面试自我介绍3篇
java 面试自我介绍 3 篇 java 面试自我介绍篇一: 我叫赵,我的同学更都喜欢称呼我的英文名字,叫,六月的 意思,是君的谐音.我来自安徽的市,在 21 年我以市全市第一名 的成绩考上了大学, ...
- java 下拉复选框_JAVA个人小程序GUI篇-收银(标签、按钮、复选框、下拉标、文本域、表格······)...
1 //导入包 2 importjava.awt.BorderLayout;3 importjava.awt.EventQueue;4 5 importjavax.swing.JFrame;6 imp ...
- 学习笔记(07):Java小白修炼手册-基础语法:从零开始学Java(二)
立即学习:https://edu.csdn.net/course/play/27274/361057?utm_source=blogtoedu 类和对象的入门 类:是一个模板,是抽象的,它描述一类对象 ...
- 从零开始学飞塔第一篇:飞塔防火墙基本上网配置(PPPoE拨号固定IP上网)FortiGate Broadband internet access
飞塔防火墙基本上网配置一共分三个部分-----接口-----路由-----策略,且防火墙可代替路由器接入互联网.本文参考Aggy梁工的博客,已征得本人同意.首先我们讲的是PPPoE拨号上网的配置,再讲 ...
- 从零开始学产品第二篇:关于测试的一切
第一章 动手设计之前,先学会验收 先放一个镇楼图以示敬意. 其实用磨刀来描述测试,并不算特别的准确,但一时间想不到更好的比喻. 本章用来总述,为什么学产品要先从测试开始,以及产品和测试的关系是什么 怎 ...
- 从零开始学Kotlin-类的继承(6)
从零开始学Kotlin基础篇系列文章 Kotlin中的超类Any Kotlin 中所有类都继承超类 Any 类 class demo6 //默认继承超类Anyclass demo6 : Any() A ...
最新文章
- C++中public、protected、private的差别
- 动态执行c# 脚本片段
- java+character类使用_Java Character类应用实例
- android 单元测试 多线程,单元测试多线程Android RxJava
- IoU,ROI 和 ROC,AUC区分
- 陆正耀为瑞幸数据造假道歉:非常自责 会全力挽回损失
- Postman使用总结(1)——Postman 自动化测试小结
- hibernate课程 初探单表映射1-2 ORM定义
- mysql force_MySQL force Index 强制索引概述
- SVN客户端安装与常用操作(超详细)
- iOS 10越狱设备终于有越狱移除工具了!
- 50道逻辑编程小题目
- Linux文件--文件命名规则
- G-sensor 介绍
- 51CTO学院 oracle相关视频地址
- SAP SD 销售中的借贷项凭证
- 计算机网络学习——套接字实验(二)
- 让dropout在图像超分辨领域大放异彩![2022 CVPR]
- 网站带不带www真的不一样,很多新手不知道区别会被坑死的
- 设计模式GOF23之-------------------结构型模式(适配器模式、代理模式、桥接模式、装饰模式、组合模式、外观模式、享元模式)
热门文章
- java 银行管理系统怎么储存账户信息_银行管理系统 实现用户注册 登录 存、取款 交易记录查询和修改用户信息等功能...
- oracle共享内存设置spfile,IPC 资源、kernel.shmmax和Oracle 共享内存的调整
- Python+OpenCV:立体图像深度图(Depth Map from Stereo Images)
- 批处理脚本:判断进程是否存在
- Halcon:标准标定板的自制方法
- ssm如何支持热部署_最新Spring Boot实战文档推荐:项目搭建+配置+SSM整合
- 惠普谢少毅:网络攻击威胁在线交易
- 高质量 Android 开发框架 LoonAndroid 详解
- 学习VIM之2014
- ant编译mysql驱动