Mysql高手系列 - 第21篇:什么是索引?
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能。
这是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 |
| 路人甲 | 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系列目录
- 第1篇:mysql基础知识
- 第2篇:详解mysql数据类型(重点)
- 第3篇:管理员必备技能(必须掌握)
- 第4篇:DDL常见操作
- 第5篇:DML操作汇总(insert,update,delete)
- 第6篇:select查询基础篇
- 第7篇:玩转select条件查询,避免采坑
- 第8篇:详解排序和分页(order by & limit)
- 第9篇:分组查询详解(group by & having)
- 第10篇:常用的几十个函数详解
- 第11篇:深入了解连接查询及原理
- 第12篇:子查询
- 第13篇:细说NULL导致的神坑,让人防不胜防
- 第14篇:详解事务
- 第15篇:详解视图
- 第16篇:变量详解
- 第17篇:存储过程&自定义函数详解
- 第18篇:流程控制语句
- 第19篇:游标详解
- 第20篇:异常捕获及处理详解
mysql系列大概有20多篇,喜欢的请关注一下,欢迎大家加我微信itsoku或者留言交流mysql相关技术!

Mysql高手系列 - 第21篇:什么是索引?的更多相关文章
- Mysql高手系列 - 第24篇:如何正确的使用索引?【高手进阶】
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第24篇. 学习索引,主要是 ...
- Mysql高手系列 - 第26篇:聊聊如何使用mysql实现分布式锁
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第26篇. 本篇我们使用my ...
- Mysql高手系列 - 第9篇:详解分组查询,mysql分组有大坑!
这是Mysql系列第9篇. 环境:mysql5.7.25,cmd命令中进行演示. 本篇内容 分组查询语法 聚合函数 单字段分组 多字段分组 分组前筛选数据 分组后筛选数据 where和having的区 ...
- Mysql高手系列 - 第10篇:常用的几十个函数详解,收藏慢慢看
这是Mysql系列第10篇. 环境:mysql5.7.25,cmd命令中进行演示. MySQL 数值型函数 函数名称 作 用 abs 求绝对值 sqrt 求二次方根 mod 求余数 ceil 和 ce ...
- Mysql高手系列 - 第13篇:细说NULL导致的神坑,让人防不胜防
这是Mysql系列第13篇. 环境:mysql5.7.25,cmd命令中进行演示. 当数据的值为NULL的时候,可能出现各种意想不到的效果,让人防不胜防,我们来看看NULL导致的各种神坑,如何避免? ...
- Mysql高手系列 - 第18篇:mysql流程控制语句详解(高手进阶)
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第18篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...
- Mysql高手系列 - 第19篇:mysql游标详解,此技能可用于救火
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第19篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...
- Mysql高手系列 - 第20篇:异常捕获及处理详解(实战经验)
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第20篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...
- Mysql高手系列 - 第22篇:深入理解mysql索引原理,连载中
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第22篇. 背景 使用mys ...
随机推荐
- [python]通过微信公众号“Python程序员”,编写python代码
今天发现微信公众号中,居然可以编写python代码,很是惊喜,觉得蛮有趣的. 步骤如下: 1.关注微信公众号“Python程序员” 2.关注成功后,点击右下角的“潘多拉”->"Pyth ...
- 2019nc#4
题号 标题 已通过代码 题解 通过率 团队的状态 A meeting 点击查看 树直径 604/2055 B xor 点击查看 线段树维护线性基交 81/861 未通过 C sequence 点击 ...
- 2018宁夏邀请赛 Continuous Intervals(单调栈 线段树
https://vjudge.net/problem/Gym-102222L 题意:给你n个数的序列,让判断有几个区间满足排完序后相邻两数差都不大于1. 题解:对于一个区间 [L,R],记最大值为 m ...
- codeforces 876 F. High Cry(思维)
题目链接:http://codeforces.com/contest/876/problem/F 题解:一道简单的思维题,知道最多一共有n*(n+1)/2种组合,不用直接找答案直接用总的组合数减去不符 ...
- 楼房重建 HYSBZ - 2957
楼房重建 HYSBZ - 2957 第一次写分块, 写了之后觉得真的是暴力的一比. 题解:先讲n分成 sqrt(n)块,记得补上末尾的, 然后就是对于每一次更新操作, 都重新的讲这个块里面的有效楼放入 ...
- JavaScript new的运行过程
参考 MDN网站的运算符 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new new 运算符 ...
- Spring Boot2 系列教程(二)创建 Spring Boot 项目的三种方式
我最早是 2016 年底开始写 Spring Boot 相关的博客,当时使用的版本还是 1.4.x ,文章发表在 CSDN 上,阅读量最大的一篇有 43W+,如下图: 2017 年由于种种原因,就没有 ...
- 深入理解 Java 中 SPI 机制
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/vpy5DJ-hhn0iOyp747oL5A作者:姜柱 SPI(Service Provider ...
- 【Offer】[48] 【最长不含重复字符的子字符串】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度.假设字符串中只包含'a'~'z'的字符.例如,在字符串&q ...
- Java中时间API使用详解
目录 Java中时间API使用详解 1. 时区概念 2. 几种常见的时间 3. 时间戳 4. Java中的时间API 5. Java8中新添加的时间API 6. 在东八区的机器上获得美国时间 Java ...