数据库索引有什么作用和好处?

来源:网络 作者:花瓣の花的语言  更新 :2022-12-03 04:22

数据库索引有什么作用和好处?

数据库索引是为了增加查询速度而对表字段附加的一种标识。见过很多人机械的理解索引的概念,认为增加索引只有好处没有坏处。这里想把之前的索引学习笔记总结一下:首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。那么在任何时候都应该加索引么?这里有几个反例:1、如果每次都需要取到所有表记录,无论如何都必须进行全表扫描了,那么是否加索引也没有意义了。2、对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义。3、对于记录比较少的表,增加索引不会带来速度的优化反而浪费了存储空间,因为索引是需要存储空间的,而且有个致命缺点是对于update/insert/delete的每次执行,字段的索引都必须重新计算更新。那么在什么时候适合加上索引呢?我们看一个Mysql手册中举的例子,这里有一条sql语句:SELECTc.companyID,c.companyNameFROMCompaniesc,UseruWHEREc.companyID=u.fk_companyIDANDc.numEmployees>=0ANDc.companyNameLIKE'%i%'ANDu.groupIDIN(SELECTg.groupIDFROMGroupsgWHEREg.groupLabel='Executive')这条语句涉及3个表的联接,并且包括了许多搜索条件比如大小比较,Like匹配等。在没有索引的情况下Mysql需要执行的扫描行数是77721876行。而我们通过在companyID和groupLabel两个字段上加上索引之后,扫描的行数只需要134行。在Mysql中可以通过ExplainSelect来查看扫描次数。可以看出来在这种联表和复杂搜索条件的情况下,索引带来的性能提升远比它所占据的磁盘空间要重要得多。那么索引是如何实现的呢?大多数DB厂商实现索引都是基于一种数据结构——B树。因为B树的特点就是适合在磁盘等直接存储设备上组织动态查找表。B树的定义是这样的:一棵m(m>=3)阶的B树是满足下列条件的m叉树:1、每个结点包括如下作用域(j,p0,k1,p1,k2,p2,...ki,pi)其中j是关键字个数,p是孩子指针2、所有叶子结点在同一层上,层数等于树高h3、每个非根结点包含的关键字个数满足[m/2-1]<=j<=m-14、若树非空,则根至少有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树索引转变为和合适的散列索引以追求进一步提高搜索速度。我想其它数据库厂商也会有类似的策略,毕竟在数据库战场上,搜索速度和管理安全一样是非常重要的竞争点。

你觉得字典的索引有啥用,数据库的索引就有啥用。

数据库小的话体现不出来,数据库大的话就体现的很优越了我有一个测试软件,可以让你看看索引的好处。不加索引的查找时间是100ms,加了之后是50ms。

- END -

电动车怎么调节座位高度

电动车怎么调节座位高度

电动车怎么调节座位高度,电动车是现在比较流行的交通工具,有很多使用小技巧。本次给大家介绍电动车怎么调节座位高度...

移动如何降为18元套餐方法(Funtonch OS 10优惠套餐)

移动如何降为18元套餐方法(Funtonch OS 10优惠套餐)

打开【微信】,点击【搜索】,搜索【中国移动10086】,进入公众号后点击【办理】,选择【优惠套餐】,确保登录上自己的移动...

钢琴曲tassel什么意思(被誉为世上最好听的钢琴曲)

钢琴曲tassel什么意思(被誉为世上最好听的钢琴曲)

钢琴曲tassel什么意思,表达了一种宁静、空灵又带着一些忧伤的意境。《Tassel》被誉为世上最好听的钢琴曲之一,当缓缓...

行胜于言质胜于华什么意思(行胜于言,质胜于华的意思是:少说多做,不是不说而是需要用实际)

行胜于言质胜于华什么意思(行胜于言,质胜于华的意思是:少说多做,不是不说而是需要用实际)

行胜于言质胜于华什么意思,行胜于言,质胜于华的意思是:少说多做,不是不说而是需要用实际行动来证明;无论是才华和外表都...

李讷被叫家长是什么电视剧(东方红1949剧情介绍)

李讷被叫家长是什么电视剧(东方红1949剧情介绍)

李讷被叫家长是什么电视剧,李讷被叫家长是电视剧《东方红1949》中的剧情。《东方红1949》是由苏舟执导,唐国强、杜雨...

两个一以贯之是什么内容(坚持党对国有企业的领导与建立现代企业制度二者不可偏废)

两个一以贯之是什么内容(坚持党对国有企业的领导与建立现代企业制度二者不可偏废)

两个一以贯之是什么内容,两个一以贯之是坚持党对国有企业的领导是重大政治原则,必须一以贯之;建立现代企业制度是国有...

蝴蝶的别名有什么(蝴蝶的别称:蝶、胡蝶、浮蝶儿、蝶等等)

蝴蝶的别名有什么(蝴蝶的别称:蝶、胡蝶、浮蝶儿、蝶等等)

一、蝴蝶的别称:蛱蝶、胡蝶、浮蝶儿、蝶等等。二、蝴蝶的外形特征:1、体形大多在5~10cm之间,身体分为头、胸、腹;2、两...

各地方言怎么称呼孩子

各地方言怎么称呼孩子

各地方言怎么称呼孩子 lexiiiibb回答了:1、河南:妞或者妞妞,孩~2、重庆:娃娃,娃儿3、湖南:崽崽,宝坨,毛毛4、南方很多地方...

龙翔凤舞态婆娑指什么生肖

龙翔凤舞态婆娑指什么生肖

龙翔凤舞态婆娑指生肖马。马在动物分类学中分类为,脊椎动物亚门、哺乳纲、奇蹄目、马科、马属、马。是一种草食性动...

做亏事心夜怕鬼代表什么生肖(做亏事心夜怕鬼代表生肖蛇)

做亏事心夜怕鬼代表什么生肖(做亏事心夜怕鬼代表生肖蛇)

做亏事心夜怕鬼代表生肖蛇。生肖蛇的人性格淡漠,冷静,独来独往,永远都活在自己的世界里,仿佛所有人都不懂他们,只要自己...

查看更多综合百科