谈数据库索引和Sqlite中索引的使用fooCoder

要使用索引对数据库的数据操作进行优化,那必须明确几个问题:1.什么是索引2.索引的原理3.索引的优缺点4.什么时候需要使用索引,如何使用围绕这几个问题,来探究索引在数据库操作中所起到的作用。

1.数据库索引简介

大致的分裂步骤如下:1)创建两个儿子节点2)将原节点中的数据近似分为两半,写入两个新的孩子节点中。3)在跟节点中放置指向页节点的指针当你不断向表中插入数据,根节点中指向叶节点的指针也被插满,当叶子还需要分裂的时候,根节点没有空间再创建指向新的叶节点的指针。那么数据库就会创建分支节点。随着叶子节点的分裂,根节点中的指针都指向了这些分支节点。随着数据的不断插入,索引会增加更多的分支节点,使树结构变成这样的一个多级结构。

3.索引的种类

1)聚集索引:表中行的物理顺序与键值的逻辑(索引)顺序相同。因为数据的物理顺序只能有一种,所以一张表只能有一个聚集索引。如果一张表没有聚集索引,那么这张表就没有顺序的概念,所有的新行都会插入到表的末尾。对于聚集索引,叶节点即存储了数据行,不再有单独的数据页。就比如说我小时候查字典从来不看目录,我觉得字典本身就是一个目录,比如查裴字,只需要翻到p字母开头的,再按顺序找到e。通过这个方法我每次都能最快的查到老师说的那个字,得到老师的表扬。

2)非聚集索引:表中行的物理顺序与索引顺序无关。对于非聚集索引,叶节点存储了索引字段值以及指向相应数据页的指针。叶节点紧邻在数据之上,对数据页的每一行都有相应的索引行与之对应。有时候查字典,我并不知道这个字读什么,那我就不得不通过字典目录的“部首”来查找了。这时候我会发现,目录中的排序和实际正文的排序是不一样的,这对我来说很苦恼,因为我不能比别人快了,我需要先再目录中找到这个字,再根据页数去找到正文中的字。

4.索引与数据的查询,插入与删除

1)查询。查询操作就和查字典是一样的。当我们去查找指定记录时,数据库会先查找根节点,将待查数据与根节点的数据进行比较,再通过根节点的指针查询下一个记录,直到找到这个记录。这是一个简单的平衡树的二分搜索的过程,我就不赘述了。在聚集索引中,找到页节点即找到了数据行,而在非聚集索引中,我们还需要再去读取数据页。

2)插入。聚集索引的插入操作比较复杂,最简单的情况,插入操作会找到对于的数据页,然后为新数据腾出空间,执行插入操作。如果该数据页已经没有空间,那就需要拆分数据页,这是一个非常耗费资源的操作。对于仅有非聚集索引的表,插入只需在表的末尾插入即可。如果也包含了聚集索引,那么也会执行聚集索引需要的插入操作。

3)删除。删除行后下方的数据会向上移动以填补空缺。如果删除的数据是该数据页的最后一行,那么这个数据页会被回收,它的前后一页的指针会被改变,被回收的数据页也会在特定的情况被重新使用。与此同时,对于聚集索引,如果索引页只剩一条记录,那么该记录可能会移动到邻近的索引表中,原来的索引页也会被回收。而非聚集索引没办法做到这一点,这就会导致出现多个数据页都只有少量数据的情况。

5.索引的优缺点其实通过前面的介绍,索引的优缺点已经一目了然。先说优点:1)大大加快数据的检索速度,这也是创建索引的最主要的原因2)加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

3)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度,这个是比较大的问题。

6.索引的使用根据上文的分析,我们大致对什么时候使用索引有了自己的想法(如果你没有,回头再看一遍。。。)。一般我们需要在这些列上建立索引:1)在经常需要搜索的列上,这是毋庸置疑的;2)经常同时对多列进行查询,且每列都含有重复值可以建立组合索引,组合索引尽量要使常用查询形成索引覆盖(查询中包含的所需字段皆包含于一个索引中,我们只需要搜索索引页即可完成查询)。同时,该组合索引的前导列一定要是使用最频繁的列。对于前导列的问题,在后面sqlite的索引使用介绍中还会做讨论。3)在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度,连接条件要充分考虑带有索引的表。;

4)在经常需要对范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的,同样,在经常需要排序的列上最好也创建索引。

6)在经常放到where子句中的列上面创建索引,加快条件的判断速度。要注意的是where字句中对列的任何操作(如计算表达式,函数)都需要对表进行整表搜索,而没有使用该列的索引。所以查询时尽量把操作移到等号右边。

对于以下的列我们不应该创建索引:1)很少在查询中使用的列2)含有很少非重复数据值的列,比如只有0,1,这时候扫描整表通常会更有效3)对于定义为TEXT,IMAGE的数据不应该创建索引。这些字段长度不固定,或许很长,或许为空。当然,对于更新操作远大于查询操作时,不建立索引。也可以考虑在大规模的更新操作前drop索引,之后重新创建,不过这就需要把创建索引对资源的消耗考虑在内。总之,使用索引需要平衡投入与产出,找到一个产出最好的点。

7.在sqlite中使用索引

2)很多对索引不熟悉的朋友在表中创建了索引,却发现没有生效,其实这大多数和我接下来讲的有关。对于where子句中出现的列要想索引生效,会有一些限制,这就和前导列有关。所谓前导列,就是在创建复合索引语句的第一列或者连续的多列。比如通过:CREATEINDEXcomp_indONtable1(x,y,z)创建索引,那么x,xy,xyz都是前导列,而yz,y,z这样的就不是。下面讲的这些,对于其他数据库或许会有一些小的差别,这里以sqlite为标准。在where子句中,前导列必须使用等于或者in操作,最右边的列可以使用不等式,这样索引才可以完全生效。同时,where子句中的列不需要全建立了索引,但是必须保证建立索引的列之间没有间隙。举几个例子来看吧:

用如下语句创建索引:CREATEINDEXidx_ex1ONex1(a,b,c,d,e,...,y,z);这里是一个查询语句:...WHEREa=5ANDbIN(1,2,3)ANDcISNULLANDd='hello'这显然对于abcd四列都是有效的,因为只有等于和in操作,并且是前导列。再看一个查询语句:...WHEREa=5ANDbIN(1,2,3)ANDc>12ANDd='hello'那这里只有a,b和c的索引会是有效的,d列的索引会失效,因为它在c列的右边,而c列使用了不等式,根据使用不等式的限制,c列已经属于最右边。最后再看一条:...WHEREbIN(1,2,3)ANDcNOTNULLANDd='hello'

索引将不会被使用,因为没有使用前导列,这个查询会是一个全表查询。

其实除了索引,对查询性能的影响因素还有很多,比如表的连接,是否排序等。影响数据库操作的整体性能就需要考虑更多因素,使用更对的技巧,不得不说这是一个很大的学问。

最后在android上使用sqlite写一个简单的例子,看下索引对数据库操作的影响。创建如下表和索引:db.execSQL("createtableifnotexistst1(a,b)");db.execSQL("createindexifnotexistsiaont1(a,b)");插入10万条数据,分别对表进行如下操作:select*fromt1wherea='90012'插入:insertintot1(a,b)values('10008','name1.6982235534984673')更新:updatet1setb='name1.999999'wherea='887'

删除:deletefromt1wherea='1010'

数据如下(5次不同的操作取平均值):操作无索引有索引查询170ms5ms插入65ms75ms更新240ms52ms删除234ms78ms

可以看到显著提升了查询的速度,稍稍减慢了插入速度,还稍稍提升了更新数据和删除数据的速度。如果把更新和删除中的where子句中的列换成b,速度就和没有索引一样了,因为索引失效。所以索引能大幅度提升查询速度,对于删除和更新操作,如果where子句中的列使用了索引,即使需要重新build索引,有可能速度还是比不使用索引要快的。对与插入操作,索引显然是个负担。同时,索引让db的大小增加了2倍多。

THE END
1.养育系统从备孕到参战!这一篇就够啦!(正式版)Q:已婚和未婚获取孩子的优缺点? A:已婚玩家自己生育,理论上可以不花银两,全靠师贡培养至6岁参战,优点是省钱,缺点是操作繁琐,需要频繁喂养、休息(如果只用师贡更繁琐);未婚玩家只能通过领养,完成5天游历大疆任务,直接获取6岁宝宝!和婚孕玩家培养到6岁的宝宝完全一样!优点操作简单,缺点是必须花费银两,并且花费比养育https://ds.163.com/article/604b56ef4ebd8e4b3cee0c58/
2.www.plascustomized.com/xxxr90190797.htm黄色电影强奸少女一级片 13.08MB 83好评 无圣光猛男 色婷婷久久五月综合色啦网ww se01线路1和线路2线路三的优缺点 538.25MB 39好评 av嗯受不了嗯哦浪 ruyi4444xxxx18 性姑娘泰国一区二区三区 65.42MB 979好评 亚洲乳交 女生张开腿让男生桶的APP大全 色洛洛狠狠干三级片三级片三级片 311.29http://www.plascustomized.com/xxxr90190797.htm
3.线上课程教学反思(精选25篇)一、线上教学的优缺点 1.优点学习的方式比较自由,大家可以在家或图书馆或咖啡厅等任何有网络的地方进行上课,还可以以最放松的方式听课,可以穿着睡衣、拖鞋等,且上课的环境也可以是自己熟悉的、舒适的、喜欢的等;学生通过网络上课,也不用担心旁边有别的同学 https://www.ruiwen.com/word/xianshangkechengjiaoxuefansi.html
4.鼠宝宝起名宜用字鼠宝宝起名宜忌如何取个好名字名字就是给人的第一印象,除此之外名字也包含了许多的寓意以及父母长辈的期望,那么怎样才能够给2020出生的鼠宝宝起个好名字呢,下面看看吧。 1、 结合属鼠生肖性格(优缺点来吸取与避免) 2021年属鼠人,庚子年,为金鼠。属鼠人本身特点就是聪明机敏,机警性高,大度又善言辞,不过脾气较为暴躁,胆子小,为人比较自私。https://www.snsnb.com/post-143026-1.html
5.八年级《傅雷家书》名著阅读《傅雷家书》是我国文学艺术翻译家傅雷及夫人1954—1966年间写给孩子傅聪、傅敏等的家信摘编,该书是一本优秀的青年思想修养读物,是素质教育的经典范本,是充满着父爱的教子名篇。他们苦心孤诣、呕心沥血地培养的两个孩子(傅聪—著名钢琴大师、傅敏—英语特级教师)是他们先做人、后成“家”,独立思考,因材施教等教育思http://www.byxtlzx.com/xsly/kczy/yw/2019-02-01/658.html
6.一个月宝宝什么睡姿好宝宝侧身睡多久换姿势婴幼儿宝宝平躺睡一个月还是侧卧睡好?一个月的宝宝不会翻身,建议平躺侧睡,但这两种睡姿的优缺点也很明显。一般来说,一个月内的宝宝睡姿不要长时间保持同样的姿势,建议平躺侧卧交替。 侧卧:侧卧包括左侧卧和右侧卧。 对于宝宝来说,右侧卧也增加了睡眠时的吞咽动作,促进了中耳粘液的排出,减少了病菌的留存机会和感染的风https://m.fh21.com.cn/baby/mip/6914440.html
7.两个孩子两居不够住房更买不起本报讯(记者 李泽伟)“单独生两孩”政策放开,符合条件的夫妇有多少人愿意生二胎?北京青年报记者昨日选取了100个“单独”且已生育一个孩子的家庭样本进行调查,结果显示,25人明确表示想要生二胎,30人表示需要再考虑考虑,两者相加占比超过一半;还有45人明确表示不想要二胎。 https://m.loupan.com/zhuzhou/news/201803/1051954
8.优秀学生家长代表发言稿(通用30篇)孩子的爸爸常年在克拉玛依工作,孩子和他在一起相聚的日子一年不超过一个月,我们家就只有我和两个儿子每天生活在一起。我工作繁忙,下班回家后除了做饭,打扫,基本上就没有很多时间辅导孩子学习,但孩子在学习上都很自觉,放学回家一定首先完成作业,这也是我在孩子读一年级的时候就坚决要求他们做到的一件事,在孩子学习的https://www.yjbys.com/yanjianggao/fanwen/3687286.html
9.我有两个孩子,小的三岁半,听说有问必答我有两个孩子,小的三岁半,听说第一个能药流,这个还管用吗? 温馨提示:因无法面诊,医生建议仅供参考 董增胜 妇产科 极速问诊 三级甲等 山东省中医院 问题分析:您好!药物流产与第几胎之间是没有必然的联系的,一般在怀孕的 49天之内是可以进行药物流产的,但是有可能会出现流产不干净的情况的你如果计划流产的话,https://3g.club.xywy.com/static/20151005/78072036.htm
10.数据结构概念部分图状或网状结构任何一个结点都有什么顺序表的优缺点: 优点:结构简单,可直接定位到表中任意元素,并可随机存取,连续存取速度快 缺点:存储空间难于准确静态分配,分配大了浪费空间,分配小了不够用, 插入,删除操作不太方便,需要移动大量元素,效率较低 单链表 在链式存储结构下,线性表的存储空间可以分散不连续的,一个指针的存储节点的结构如图 https://blog.csdn.net/wangjunlei666/article/details/125459890
11.大男子主义是什么意思大男子主义的优缺点 1、大男子主义的缺点 大男子主义的男人太喜欢把自己的观念强加于人,希望自己的家人及伴侣,绝对的听从自己,有做指挥的一种感觉,在家里,也全部都有男主人说了算,在外面也一样,不能让自己没面子,而且很多大男子主义的男人还不准自己的妻子有过多的社交活动等等。 https://mip.jy135.com/qinggan/46063.html
12.二胎家庭安全座椅方案,两个孩子安全座椅怎么放目前不少家庭都已经购买了儿童安全座椅,但对于有些家庭是有两个宝宝的,那么就需要安装两个安全座椅,所以今天给大家介绍一下二胎家庭安全座椅的方案。 两个孩子安全座椅怎么放 两个安全座椅在不同座椅布局的车型上,会有不同的摆放方式。其中需要涉及到常见的5座和7座两种车型,7座车还分为223和232两种布局。按照座椅https://m.yoojia.com/ask/3-9222648305400572514.html
13.www.ycylyy.com/nodenews13062721/985288.shtml帅哥大鸡巴一级爱情故事毛片 没带罩子被c 一个b舔两个b 67.24MB 95好评 对肉体柔软颜值好不错的丝袜美女欲罢不能,抱着销魂美臀用力耸动插入啪啪干不 18禁止露裸体奶头美女动态图 成人寡妇手机直播视频在线观看 21.39MB 79好评 嗯~啊 不要了小说大尺度 操操操女人阴性 日韩欧美aaaaaaaa黄片 798http://www.ycylyy.com/nodenews13062721/985288.shtml