旅行社网站建设规划的内容,如何做分公司网站,网站开发软硬件,wordpress阅读数 显示k这是Mysql系列第21篇。
本文开始连续3篇详解mysql索引#xff1a; 第1篇来说说什么是索引#xff1f; 第2篇详解Mysql中索引的原理 第3篇结合索引详解关键字explain
本文为索引第一篇#xff1a;我们来了解一下什么是索引#xff1f;
路人在搞计算机之前#xff0c;…这是Mysql系列第21篇。
本文开始连续3篇详解mysql索引 第1篇来说说什么是索引 第2篇详解Mysql中索引的原理 第3篇结合索引详解关键字explain
本文为索引第一篇我们来了解一下什么是索引
路人在搞计算机之前是负责小区建设规划的上级领导安排路人负责一个万人小区建设规划并提了一个要求可以快速通过户主姓名找到户主的房子让路人出个好的解决方案。
方案1
刚开始路人没什么经验实在想不到什么好办法。
路人告诉领导你可以去敲每户的门然后开门之后再去询问房主姓名是否和需要找的人姓名一致。
领导一听郁闷了我敲你的头1万户我一个个找找到什么时候了你明天不用来上班了。 这里面涉及到的时间有走到每户的门口耗时、敲门等待开门耗时、询问户主获取户主姓名耗时、将户主姓名和需要查找的姓名对比是否一致耗时。 加入要找的人刚好在最后一户领导岂不是要疯掉了需要重复1万次上面的操作。 上面是最原始最耗时的做法可能要找的人根本不在这个小区白费力的找了1万次岂不是要疯掉。
方案2
路人灵机一动想到了一个方案 给所有的户主制定一个编号从1-10000户主将户号贴在自家的门口 路人自己制作了一个户主和户号对应的表格我们叫做户主目录表共1万条记录如下
户主姓名房屋编号刘德华00001张学友00002路人00888路人甲java10000
此时领导要查找路人甲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路人甲java100-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路人甲Java048-08-02
现在查找户号步骤如下 通过姓名获取姓对应的首字母 在26个表格中找到对应姓的表格如路人甲Java对应L表 在L表中循环遍历找到路人甲Java的户号 根据户号按照方案3中的(2/3/4)步骤找对应的户主
理想情况
1万户主的姓氏分配比较均衡那么每个姓氏下面分配385户10000/26 那么找到某个户主最多需要:26次385次 410次相对于1万次少了很多。
最坏的情况
1万个户主的姓氏都是一样的导致这1万个户主信息都位于同一个姓氏户主表此时查询又变为了1万多次。不过出现姓氏一样的情况比较低。
如果担心姓氏不足以均衡划分户主信息那么也可以通过户主姓名的笔画数来划分或者其他方法主要是将用户信息划分为不同的区可以快速过滤一些不相关的户主。
上面几个方案为了快速检索到户主用到了一些数据结构通过这些数据结构对户主的信息进行组织从而可以快速过滤掉一些不相关的户主减少查找次数快速定位到户主的房子。
索引是什么
通过上面的示例我们可以概况一下索引的定义索引是依靠某些数据结构和算法来组织数据最终引导用户快速检索出所需要的数据。
索引有2个特点 通过数据结构和算法来对原始的数据进行一些有效的组织 通过这些有效的组织可以引导使用者对原始数据进行快速检索
mysql为了快速检索数据也用到了一些好的数据结构和算法来组织表中的数据加快检索效率。