数据库索引是为了增加查询速度而对表字段附加的一种标识。见过很多人机械的理解索引的概念,认为增加索引只有好处没有坏处。这里想把之前的索引学习笔记总结一下:

首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。那么在任何时候都应该加索引么?这里有几个反例:1、如果每次都需要取到所有表记录,无论如何都必须进行全表扫描了,那么是否加索引也没有意义了。2、对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义。3、对于记录比较少的表,增加索引不会带来速度的优化反而浪费了存储空间,因为索引是需要存储空间的,而且有个致命缺点是对于update/insert/delete的每次执行,字段的索引都必须重新计算更新。

那么在什么时候适合加上索引呢?我们看一个Mysql手册中举的例子,这里有一条sql语句:

SELECT c.companyID, c.companyName FROM Companies c, User u WHERE c.companyID = u.fk_companyID AND c.numEmployees >= 0 AND c.companyName LIKE '%i%' AND u.groupID IN (SELECT g.groupID FROM Groups g WHERE g.groupLabel = 'Executive')

这条语句涉及3个表的联接,并且包括了许多搜索条件比如大小比较,Like匹配等。在没有索引的情况下Mysql需要执行的扫描行数是77721876行。而我们通过在companyID和groupLabel两个字段上加上索引之后,扫描的行数只需要134行。在Mysql中可以通过Explain Select来查看扫描次数。可以看出来在这种联表和复杂搜索条件的情况下,索引带来的性能提升远比它所占据的磁盘空间要重要得多。

那么索引是如何实现的呢?大多数DB厂商实现索引都是基于一种数据结构——B树。因为B树的特点就是适合在磁盘等直接存储设备上组织动态查找表。B树的定义是这样的:一棵m(m>=3)阶的B树是满足下列条件的m叉树:

1、每个结点包括如下作用域(j, p0, k1, p1, k2, p2, ... ki, pi) 其中j是关键字个数,p是孩子指针

2、所有叶子结点在同一层上,层数等于树高h

3、每个非根结点包含的关键字个数满足[m/2-1]<=j<=m-1

4、若树非空,则根至少有1个关键字,若根非叶子,则至少有2棵子树,至多有m棵子树

看一个B树的例子,针对26个英文字母的B树可以这样构造:

可以看到在这棵B树搜索英文字母复杂度只为o(m),在数据量比较大的情况下,这样的结构可以大大增加查询速度。然而有另外一种数据结构查询的虚度比B树更快——散列表。Hash表的定义是这样的:设所有可能出现的关键字集合为u,实际发生存储的关键字记为k,而|k|比|u|小很多。散列方法是通过散列函数h将u映射到表T[0,m-1]的下标上,这样u中的关键字为变量,以h为函数运算结果即为相应结点的存储地址。从而达到可以在o(1)的时间内完成查找。

然而散列表有一个缺陷,那就是散列冲突,即两个关键字通过散列函数计算出了相同的结果。设m和n分别表示散列表的长度和填满的结点数,n/m为散列表的填装因子,因子越大,表示散列冲突的机会越大。

因为有这样的缺陷,所以数据库不会使用散列表来做为索引的默认实现,Mysql宣称会根据执行查询格式尝试将基于磁盘的B树索引转变为和合适的散列索引以追求进一步提高搜索速度。我想其它数据库厂商也会有类似的策略,毕竟在数据库战场上,搜索速度和管理安全一样是非常重要的竞争点。

mysql数据库中 索引的作用是什么意思_什么是数据库索引,索引有什么作用相关推荐

  1. 【审批工作流camunda教程】(二):camunda数据库中的48张表分别的大致含义,数据库表结构介绍

    教程一: 创建camunda项目=>部署流程定义=>创建流程实例=>走完流程实例 教程二: camunda数据库中的47张表分别的大致含义,数据库表结构介绍 教程三: 下载camun ...

  2. echarts导入mysql数据库_Echarts最新:Django中从mysql数据库中获取数据传到echarts方式_爱安网 LoveAn.com...

    关于"Echarts"的最新内容 聚合阅读 这篇文章主要介绍了基于vue+echarts 数据可视化大屏展示的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随 ...

  3. 数据库中各表关联图及其说明_如何在图中思考:图论及其应用的说明性介绍

    数据库中各表关联图及其说明 by Vardan Grigoryan (vardanator) 由Vardan Grigoryan(vardanator) 如何在图中思考:图论及其应用的说明性介绍 (H ...

  4. 数据库中的datatime的长度怎么设定_软件测试必备之数据库知识(一)

    无论是运维.开发.测试,还是架构师,数据库技术是一个必备加薪神器,那么,一直说学习数据库.学MySQL,到底是要学习它的哪些东西呢? 1.如何快速掌握MySQL? ​培养兴趣 兴趣是最好的老师,不论学 ...

  5. html中显示数据库中的一条数据,如何使用html表显示数据库中的数据

    我正在尝试在HTML表中显示数据库中的数据.主要问题是:该表未出现. Id String Array // Mostrar dados echo " { $databaseName = 'v ...

  6. android 对象数据库中,解析嵌套的JSON对象,并存储在数据库中的Android

    我只是试图让存储在我的JSON文件中的值,并将其保存到SQLite数据库:解析嵌套的JSON对象,并存储在数据库中的Android 这是我的JSON文件: { "list": { ...

  7. mysql教程详解之多表联合查询_详解数据库多表连接查询的实现方法

    详解数据库多表连接查询的实现方法 通过连接运算符可以实现多个表查询.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 在关系数据库管理系统中,表建立时各数据之间的关系不必 ...

  8. 数据库中的datatime的长度怎么设定_《龙珠》中超级赛亚人的设定是怎么有的?...

    展开全部 第一部就不用谈了,因为第一部中根本没涉及外星人的内容e69da5e887aa62616964757a686964616f31333433653434,孙悟空是赛亚星人,本来叫卡卡罗特,比克也 ...

  9. java读取excel数据保存到数据库中_java读取excel的内容(可保存到数据库中)

    //** poi jar包 // public classReadExcel { @SuppressWarnings("static-access")private staticS ...

最新文章

  1. JavaScript Date 对象
  2. 一、史上最强hadoop分布式集群的搭建
  3. select默认选中的option_macOS下妙用option按键
  4. identifier __ldg is undefined
  5. Python——分布式监控项目
  6. java多态机制优点_java面向对象多态性有什么好处?能说的简单易懂点,最好有代码实现结果信息,麻烦各位java大神回答一下?...
  7. Android异步批量下载图片并缓存
  8. 关于限制水晶报表的导出格式
  9. [Unity3D]推荐几个不错的网站
  10. 关于matlab表情包,matlab表情包 - matlab微信表情包 - matlabQQ表情包 - 发表情 fabiaoqing.com...
  11. 西安交大计算机系96年录取分数,西安交通大学2018年各省录取分数线
  12. 1.4.4 Performance Measures
  13. C#实现反双曲余弦函数等
  14. 计算机音乐大学排名,2019音乐类大学排行榜_2019年世界十大权威大学排名报告发布,中国891所高...
  15. 乔布斯那些经典的激励我们的语录
  16. docker: error pulling image configuration:timeout
  17. 职场黑话大全(互联网公司百科版)
  18. 珍贵!分享!全国各省市最全乡镇、街道行政区划边界shp矢量数据+wgs84坐标系+2021年7月最新获取+2018年更新数据
  19. GEE面向对象分类(先分割影像 、再计算特征、最后分类)
  20. Unity 3D项目 - 01 - 开始游戏主界面

热门文章

  1. 2007 patindex函数的用法
  2. Robo3T使用小结
  3. windows下递归删除指定文件和文件夹
  4. C#基础 Console BackgroundColor ForegroundColor 控制台的字体色和背景色
  5. 数据中台落地实施之法
  6. matlab优化函数 remez,基于Matlab的FIR滤波器的优化设计方法
  7. windows10 iis支持php,win10+iis+phpStudy配置php开发环境
  8. 习惯五:知彼解己---移情沟通的原则
  9. c语言编译学生成绩统计,c语言:编写程序,输入是个学生的学号、姓名成绩,输出学生成绩等级和不及格人数。...
  10. 纯css3画红苹果代码