专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

对数据库索引的一点见解

  数据库索引应该是我们平时工作中遇到的和数据库相关问题中比较高频的问题,也是各种面试、晋级答辩中的高频问题。但是大多情况下,我们的回答可能令面试官或答辩评委满意,或者遇到类似的问题往往手足无措,不知道该如何回答,笔者的愿望是希望通过这篇文章,能帮助大家深入的了解下数据库的索引,以后如果遇到类似的问题,我们也可以和人家侃侃而谈。
  说到数据库索引是什么,我们可能第一反应都能联想到字典的目录,但是如果我们再想一下,目录是什么?其实目录的本质还是字典的一页,那我们联想一下,那其实索引的本质也是数据。既然索引是数据,那么我们只需要了解它的数据结构和节点存储的数据内容,我们就能想明白索引的很多问题。
  要了解索引的数据结构,我们可以设想一下,如果我们自己设计一个索引,我们会怎么实现?在大多数编程语言中,针对文件的操作大多都有一个seek方法,用于从文件的指定位置来读写数据,例如在java中,RandomAccessFile类就提供了这个方法,通过注释我们可以了解到,这个方法为我们提供了从指定位置读写文件。Setsthefilepointeroffset,measuredfromthebeginningofthisfile,atwhichthenextreadorwriteoccurs。Theoffsetmaybesetbeyondtheendofthefile。Settingtheoffsetbeyondtheendofthefiledoesnotchangethefilelength。Thefilelengthwillchangeonlybywritingaftertheoffsethasbeensetbeyondtheendofthefile。parampostheoffsetposition,measuredinbytesfromthebeginningofthefile,atwhichtosetthefilepointer。exceptionIOExceptionif{codepos}islessthan{code0}orifanIOerroroccurs。publicvoidseek(longpos)throwsIOException
  通过这个方法,我们就可以设计一个简单的索引系统,文件A是索引文件,里面保存了id和这条记录在文件B(实际数据文件)中的起始位置。我们可以将索引文件加载到内存中,这样当我们需要查询id为1的数据时,我们就不需要去数据文件B中一行行查找数据,而是可以通过索引文件直接找到id为1的数据文件起始位置0,然后直接通过seek方法定位到指定文件位置,然后直接读取数据即可,这样会大大加快我们查找数据的速度。
  简单索引实现
  但是当文件大小变得很大的时候,索引文件也会变大,那么检索的速度也会随之减慢,这时候我们应该怎么处理呢?借助分而治之的思想,一个文件过大,我们就把大文件拆分即可。在java语言中,我么可以借助HashMap来实现,最简单的方法就是对id进行取模操作,id为1的数据会被放在一块内存区域中,id为3和13的会放在另外一片内存区域中,这样,我们相当于把一个大文件拆分成了10个文件,忽略取模的事件,我们的查找速度会带来10倍的提升。
  HashMap
  但是上述方案依然存在一个问题,就是无法提供范围查找的能力,那我们如何设计我们的索引,能提供范围查找的能力呢?这时候我们可能会想到二叉查找树(BinarySearchTrees)。二叉查找树规定,对于任何一个子树,这个树的左节点的值都小于根节点,右节的值都大于根节点值。这样当我们进行范围查找时,来到一个节点,如果查找的范围比这个节点小,我们只需要去左树查找即可,如果比这个节点大,我们只需要去右树查找即可。
  二叉查找树
  但是二叉查找树非常依赖于数据插入的顺序,如果我们按照1234。。。。的顺序插入数据是,这时候二叉查找树就会退化成一个链表,这样查找效率又会有所损失。
  二叉查找树退化成链表
  怎么能避免插入的顺序影响我们查询的效率呢,这个时候我们可能会想到平衡二叉查找树(AVLTrees【BalancedBinarySearchTrees】),之所以叫AVL树是因为作者名字的首字母缩写是AVL(两位作者,而不是三个哦)。AVL树能够在插入的时候通过左旋和右旋来保证任何一个子树的左树和右树的高度差不超过1,这样的特性保证了我们即使插入的数据是顺序的,AVL树也能自动平衡来达到一个标准的二叉树结构。
  AVL树
  但是,由于AVL树的特性,要求任何一个树的左树和有树的高度差不能超过1,那么当我们插入数据时,会导致树的频繁左旋和右旋来保证一颗树是一个AVL树,那么,我们插入数据的效率就会变得越来越慢,显然,AVL树也不适合成为一个索引的存储结构。这个时候我们可能会想,如果AVL树的平衡性要求没那严格,是不是就可以成为一个合格的索引结构呢?这个时候我们可能想到红黑树(RedBlackTrees),红黑树的定义非常繁琐,这里我就不细细描述了,有兴趣的朋友可以自行搜索,红黑树和AVL树最大的区别是红黑树要求任何一个子树的左树和右树的高度差不超过两倍,例如左数的高度是2,那么右树的高度不能超过4,这样特性能保证我们插入数据时避免频繁的左旋和右旋来带来插入性能的损耗。
  红黑树
  那么红黑树就是索引的最佳数据结构吗?我们可以细细想一想,一个节点我们可以认为是在磁盘的一个数据块,那么这么多树形结构在磁盘中的存储肯定不是顺序存储(因为涉及到树的旋转),那么当我们通过索引查询数据时,需要很多次的随机磁盘读写,我们知道磁盘的随机读写效率都不高,那么这种结构就无法满足我们的快速查找数据的需求。
  红黑树的读写效率主要是因为过深的树形结构导致多次随机读写带来的性能损失,那么如果我们将二叉树变成多叉树,是不是就能满足我们的需求呢?这种多叉的树形结构我们称之为BTrees。
  B树
  那么B树是我们的最佳选择吗?我们来分析下,我们知道计算机读取数据都是按照页读取的,一般的页大小为4K,而数据库一次性读取的数据一般是页的整数倍,如Mysql一次性读取的数据大小为16K。那么我们假设一块磁盘块的大小为16K,单条索引数据的大小为1K,那么一个磁盘块能放下16个索引,三层的B树能放在的总记录树是1616164096条,一般超过三层的B树查询速度就无法满足我们的需求,也就是说,B树单表的数据量大概只能在千这个数量级别,而实际我们单表的数据量远远大于这个量,所以说,B树也不是我们最佳的选择。
  那么如果我们在B树的非叶子节点不存储数据,只存取索引的值,是不是就能满足我们的需求呢?这种数据结构我们称之为BTrees。还是基于上面的假设,我们再次假设索引的大小为百分之一,那么一个磁盘块就可以存储1600条索引信息,那么三层索引能支持的数据量为160016001600非常非常约等于1000W,这也就是我们所说的关系型数据库能支撑千万级别数据量的原因。所以一般关系型数据库的底层索引存储结构都是B树。
  B树
  搞清楚了索引的数据结构,我们只需要再了解清楚B树的节点存储的都是什么数据,我们就能彻底了解索引的底层原理。我们知道,索引一般分为主键索引、唯一索引、普通索引和复合索引,下面我们就来一一讨论每种索引的数据的存储方式。
  我们知道,主键索引是一个比较特殊的存在,因为数据库的数据是保存在主键索引上的(如果没有主键,会找一个唯一索引,如果还没有唯一索引,那么数据库会生成一个唯一的rowid来绑定),也就是说,主键索引的非叶子节点存储的是主键的索引值,叶子节点存储的就是一行行的数据。这种索引和数据存储在一起的索引我们称之为聚簇索引。
  除了主键索引,唯一索引和普通索引非叶子节点存储的还是索引的值,但是他们的叶子节点就无需要在重复存储一份整行的数据,那么它的叶子节点存储的是什么呢?聪明的你应该已经想到了,没错,它的叶子节点的数据存储的就是主键的值。这种索引和数据不存储在一起的我们称之为非聚簇索引。当我们通过这个索引需要查询除了索引的列和主键列以外的列的时候,由于这个索引中的数据不能满足我们的要求,数据库就需要通过主键索引在去主键索引上找到整行数据的其他列,这种行为我们称之为回表。
  主键索引
  那么复合索引是如何存储的呢?其实复合索引和普通索引一样,非叶子节点存储的也是主键信息,唯一的区别就是索引是按照我们建立的索引列的顺序,把第一列放在前面,第二列紧跟在后面,这个时候我们可以想象成是用一个大的字符串把这几列放在一起拼接成一个大的列,所以我们常说,复合所以的匹配遵循最左匹配,因为如果没有第一列的条件,我们就无法从字符串中的位置进行索引的匹配(跟like条件前面有的原理是一样的)。
  复合索引
  这是笔者对数据库索引的一些见解,如果有什么不对的地方,欢迎大家给我留言,一起探讨学习,大家一起进步。

瓜迪奥拉21岁女儿成泳装模特!日乙长崎航海vs横滨02日乙长崎航海vs横滨202209241800思路客队不败,平负比分01,12和11北京时间9月24日1800,目前日本二级联赛排名第二的横滨FC将客场挑战联赛排名第八的长崎航海,长曾黎时尚大片太土气!发型雷人气质全无,画烟熏妆穿深V身材性感近日,曾黎在个人社交平台上晒出一组韩国某杂志社邀约拍摄的时尚大片,这次的新造型与以往风格大为不同,从照片中可以看出整体造型夸张,曾黎也是很大胆的去挑战自己,尝试不同风格了。只见这张图片文字转换成文本怎么操作?手机转换图片文字想要将图片文字转换成文本,需要怎么操作?当在生活中看到图片文字时,想要将这些文字内容转换成文本,一般只能自己识别并打字输入,非常费时费力,今天就推荐一招,教你手机进行图片文字转换文胸版王心凌晒身材,被批太暴露这是不打码能看的?当40岁的王心凌,像当年的青春少女般,重回到公众视野的时候,立马唤醒了许多人逝去的回忆一身青春洋溢的制服,扎着高马尾,伴着熟悉旋律响起,跳着俏皮的舞步,一下子让老铁们,仿佛都中了糖比看大片还爽?杜比声官方认证虚幻4引擎打造的环形战争来了比看大片还爽?杜比声官方认证虚幻4引擎打造的环形战争来了玩游戏,最重要的就是好玩,然而最近上线的一款游戏竟然让玩家有了一种看国际大片的错觉,还表示哪怕不玩游戏,只是看着游戏的故事就迪丽热巴下班显原形,跳舞打招呼太调皮,穿黑短裙配半袜认成杨幂色彩无疑是这几年时尚圈大家比较注重的元素,随着色彩饱和度的高低不同,整体展现出来的时尚感也是大不一样,因此为了能够在人群中脱颖而出,女性通常都会选择相对惊艳的时尚色彩,以此来达到自深扒皮蓬前妻的感情史,乔丹二儿子可能只是他的过路人近日,NBA名宿斯科蒂皮蓬迎来自己57岁的生日。征战NBA数十载,皮蓬7次入选全明星阵容,7次入选最佳阵容,10次入选最佳防守阵容,6次获得总冠军,2次获得奥运会金牌,入选NBA名初秋时节可以搭配短靴,有了不一样的感觉,美女也会注意保暖到了初秋时节,很多喜欢短靴的美女,开始搭配短靴出门,她们的选择的款式也会不一样,每年的流行趋势也会有一点改变,这位美女选择一款黑色的短靴,粗跟的款式,不是很高,地系带的风格,内色还一场失利却让女篮姑娘们找到赢美国的感觉,战术目的全部达成小组赛输给美国这个是计划之内的预案,这是一场可以输球的比赛。但是我们战术目的已经达成,为什么这么说呢?第一第一节开局011落后,通过人员调整,用韩旭换下李月汝之后,迅速还给美国一个孙怡录奔跑吧造型,穿牛仔短裙气质减龄,单身后更美了我在头条搞创作第二期孙怡是90后时尚辣妈,在娱乐圈中的名气算是比较大,之前和董子健是娱乐圈中令人羡慕的年轻小夫妻,只可惜他们还是分开了。恢复单身后的孙怡,似乎没什么影响,这不,参加被爱,是一种怎样的感觉?被爱,是人真实的情感需求。生活中,你有哪些被爱直接触动的时刻呢?你又是如何定义被爱的感觉呢?被爱是一种怎样的感觉?1内心就像被温柔抚摸了一下。不是所有的爱都发出轰轰烈烈的巨响,有些
中国移动研究院广东移动联合中兴通讯完成算网SPN现网验证近日,中国移动研究院广东移动联合中兴通讯在广东东莞完成算网SPN现网端到端SRv6方案试点,验证了SPN现网平滑升级支持SRv6业务的能力,并对算网SPN技术的管控面转发面保护和O辽篮又添顶级前锋!攻防兼备,战广东曾砍3517,杨鸣志在卫冕CBA联赛还有不到三周即将开启,辽宁男篮在结束教学赛之后已经重返大本营,郭艾伦张镇麟等主力球员都已经与球队进行会合。在外援阵容方面,辽宁男篮还是以弗格和莫兰德为主,其中,莫兰德确定秋意渐起,济南这座绝色山峰也太太太美了!寻秋进行时九月,日落匆忙,秋意渐渐加深,树木一片红黄,还有几多时光。秋天的到来舒展了大自然展现斑斓的魔力,秋天是一年中特别适合五感体验的旅行好时节。秋雨过后,山间瀑布和云海遍布,香山也美轮美iOS16值不值得更新,看这几个功能你喜不喜欢xdm,千呼万唤,iOS16正式版终于来了。相信很多小伙伴还在纠结到底要不要升级。升级后有哪些好用的功能,会不会遇到大家说的手机卡,耗电快的问题。别急,世超今天就带你们看下iOS1安兔兔超114W鲁大师127W跑分,ROG6天玑版开启霸榜模式安卓阵营旗舰之间的竞争实在太卷了,前不久骁龙8才成功翻盘,载誉归来,但风头很快又被联发科天玑9000盖过去了。近日,ROG游戏手机6天玑系列正式发布。没有记错的话,这是ROG游戏手喜迎二十大大批科技攻关项目催生发展新动能来源舟山日报舟山网我市今年已启动实施23项市揭榜挂帅科技攻关项目12项省尖兵领雁攻关项目将鱿鱼白片投入智能鱿鱼切片机内,鱿鱼的三维参数通过扫描仪传输到智能系统,切片机自动调整切割点警惕积分返利原始股套牌等互联网项目自古以来金融永远都是你来我往,没有凭空而来,任何事物都得有人买单,才有其价值。接下来小安就说下近期一些项目的情况,建议远离,小安只是一个搬运工,希望大家看到后自己也考察和分析一下,邢东新区,今年签约项目28个,其中5000万元以上项目28个,总投资125。92亿元新区面貌9月20日,邢台市政府新闻办举行发布会,邢东新区党工委副书记管委会副主任李尚鹏,介绍了邢东新区近年来取得的成就。会上,还回答了记者的提问。问请问邢东新区在招商选资优化营商环据说,那是藏族一种独特的历史遗留文化?崇文尚礼,西陲宝地仍属礼仪之邦热情好客,藏族同胞共是华夏儿女。关注小布的粉丝们都知道,小布的团队一直在做的就是传播西藏的文化产物和风俗。在西藏这个佛教圣地,风俗习惯在藏族人民的心里红米K50S启动5500mAh电池,将16G512G下放到2999,会火吗?在两千元左右的国产热门旗舰中,可能很多人最喜欢的是红米K系列,原因很简单,这个系列的产品把性价比做得非常到位,又有很多高端配置加持,因此符合物美价廉的形象,销量自然也就不低。在今年十年来反独促统大势不断增强来源台海网中央台办介绍党的十八大以来对台工作和两岸关系发展情况据中国台湾网中新网9月21日报道中共中央宣传部21日上午举行中国这十年系列主题新闻发布会,中央台办副主任陈元丰介绍了党
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网