MySQL中两点查找实现的详细教程

MySQL中两点查找实现的详细教程
给定一个数组升序排列的自然数,数组包含重复的数字,如{ 1,2,2,3,4,4,4,5,6,7,7 }。问题:给定任意自然数,两个点的数组,数组的正确位置返回,和功能的实现。注意:同一个号码,第一个匹配的位置或最后一场比赛的位置,通过函数传递的参数确定。

我为什么要摆脱这个问题

在数据库内核的实现中,两点查找是非常重要的。

在数据库的内核实现中,两点查找是一个非常重要的逻辑。几乎99%个或多个SQL语句(所有索引上的范围扫描/对等查询,/唯一查询等)将使用两个点查找来定位数据。

考虑数据库表t1(int主键,b int)。B场的桌子上有一个B+树索引,和B场记录在表中的标题1,2,2,3,4,4,4,5,6,7,7 { }序列。在这一点上,给出以下两个查询语句,它是用一个不同的两点查找逻辑:

SQL1:
从t1选择B,B>4;
SQL2:
从t1中选择*,B=4;
为SQL1,指数两点查找需要跳过4,返回从去年4的所有记录。对于SQL2,二点查找需要定位到第一个4,然后依次读取所有记录。

此外,对于数据库中的其他查询逻辑,两个点查找需要更多的函数,如:

SQL3:
从t1选择B,B<2;
sql4:
从t1选择B,B 2;
由于数据库索引支持反向扫描同时,SQL3和sql4语句可以使用索引反向扫描,逆向扫描,为需要定位的前2个指标,而sql4需要定位指数近2,然后开始返回索引记录满足查询条件

程序设计中两个搜索,是一个很基本的函数,容易出错。

第一个真正正确的两点查找算法发表12年前两点查找后,通过眉目传情,输入二进制搜索或两点搜索关键词,并且有大量的相关文章或博客讨论的话题。

两点找到实现,需要注意的问题

本文还没有准备好详细说明如何进行正确的两点查找。毕竟,网上有很多正确的版本,接下来我们将在纠正试卷中发现的问题的基础上做一些简单的分析,希望能在数据库中实现一个有效的二点搜索算法,甚至一个两点查找算法。

问题1:是否检查参数的有效性

在大量的论文中,开始计算低、高的参数,但是当给出这个问题的解时,低的/高的参数没有被检查。间隔是由低高有效形成的吗代码的健壮性是不够的。

在一个数据库的两点查找的实现,它是一个索引页两分钟的查找,有一个索引页,用户记录中不存在(索引页的记录全部删除了,又没有兄弟页合并)在这一点上,低/高,为0,如果按照低/高中读取记录计算,有一个逻辑错误

问题二:两点查找的中位数计算

这是一个经典的话题,如何计算两点搜索中的中位数呢文中给出了两种计算方法

算法1:中=(低+高) 2

算法二:中=低+(高u2013低) / 2

乍一看,算法简单,后两提取算法,在算法没有区别。但事实上,存在差异。算法之一,在极端的情况下,(低+高)有溢出的风险,然后得到错误的中间结果,造成的程序错误。和算法两保证中的计算,必须大于低,不高,不存在溢出的问题。

回到数据库中的两个点的查找,一个数据库的索引页(尺寸通常是8k或16K),和索引记录可以存储是有限的,所以不会有风险溢出(低+高)。这也是为什么在InnoDB中是该算法的一个实现。然而,作为一个严格的程序设计师,也推荐使用算法两扼杀在摇篮里的任何潜在的风险。

问题三:两个点查找的递归实现

超过一半的论文中使用的一个递归调用实现两点搜索。不能说递归实现是错误的,但要实现效率。众所周知,递归调用堆栈/栈的开销,其效率相对较低,效率是一个优化代码效率作为一个数据库,提供快速的查询响应系统第一。不建议使用递归实现二点查找,至少不在数据库内核实现的。据我所知,所有的开源数据库系统,如InnoDB,和PostgreSQL,不要用递归实现二点查找。

问题四:如何找到第一个/最后一个等价物

回到标题,它需要返回第一/最后的等效项,根据传入的参数,在本文的背景部分,我也解释了相应的数据库查询的问题(> > =查询需求不同)。在报纸上,80%以上的学生都是前两个小时找答案,定位到相同的值后,再根据传入的标志(用户要求:旗= 1,返回第一个对等;旗= 0,返回最后一个元素,顺序遍历等价),直到能够满足该项目的条件。

以同样的方式,也不能说这个实现是错误的,但也有一个性能问题,性能表现总是在数据库内核实现的一个重要的考虑因素(相信这也是所有应用的一个指标),在数据库中,除了主要的关键指数或唯一索引,保证关键值的唯一性,很多二级辅助指标具有相同的核心价值观。有时,相同的键值将超过数千项(考虑到用户的订单或购买记录)。

假设一个索引页有400条记录,所有相同的核心价值观。在这个时候,使用第2点查找,顺序遍历算法后,两个点只能使用一次,顺序遍历199次,最后比较了200次,效率是非常低的。当然,我也是很高兴看到学生的另一个小集团的实践(算法我期待)和使用国旗纠正每个比较的最终结果。例如:相等(等于0,大于1,但小于1),标志为1,校正后1回的比较结果,两点需要移动到高中,两点(另一方面,如果标志为0,则返回正确的结果之后,1需要移动两搜索低到中,到两点),结果,等价性仍然是两点,最后对比度只有9倍,远远小于200倍。

这个问题进一步引出下一个问题。数据库如何在数据库中实现一个通用的、更复杂的两点查找算法

问题五:数据库中两个点查找的示例

数据库中的两点查找更为复杂,需要在各种SQL查询场景中使用通用的两点查找算法。

我们总结了不同的SQL语句的四种不同的搜索模式,这是:

#定义page_cur_g 1 >查询

#定义page_cur_ge = > = 2,查询

#定义page_cur_l 3 <查询

#定义page_cur_le <= 4查询

然后,四个不同的搜索模式进行调整,当两个点找到相同键的值。例如,如果搜索模式是page_cur_g或page_cur_le,然后移动中低将继续寻找两点。如果搜索模式是page_cur_ge或page_cur_l,然后移动高page_cur_l将持续2点查找。

我们的TNT发动机采用比InnoDB不同的方案,但它也实现了相同的功能。TNT引擎总结相同键的值如下图。在这里,我不会解释它,你可以试着自己去分析它。

includekey提出比较结果:10-1算子 / * * /

=============================================================================

| 1 - 1 - 1 = 11

| 1 - 1 - 1 = 11

01 | > 11 -1

< 00 | 1 - 1 - 1

10 | < = 11 - 1

=============================================================================

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部