大家好,我正在研究搜索算法优化。
截至目前,我正在研究数据库。
在带有SQL支持的数据库中。
我可以为特定的表编写查询。
1从Table1中搜索名称为Test的数字,2搜索所有列名称Test。
我理解函数的概念但是我有兴趣学习搜索的方法是什么?
它只是简单的线性搜索,从第一个索引到第n个索引,只要条件为真,它就会抓取,因此具有O(n)速度,或者它是否具有加速其过程的唯一算法?
答案 0 :(得分:7)
如果没有索引,则是,执行线性搜索。
但是,当您将列指定为键时,数据库通常使用B Tree索引。这些是特殊调整的特殊数据结构格式(高B树分支因子),以便在磁盘硬件上运行良好,其中最重要的耗时因素是搜索操作(磁头必须移动到文件的差异部分) )。
您可以将索引视为列中值的排序/结构化副本。如果要搜索的值在索引中,则可以快速确定。如果找到它,那么它也会找到一个指针,指向主数据文件中相应行的正确位置(因此它可以去读取行中的其他列)。有时,多列索引包含查询请求的所有数据,然后它不需要跳回主文件,它只能读取它找到的内容然后完成它。
还有其他类型的索引,但我认为你明白这一点 - 重复数据并以一种快速搜索的方式排列。
在大型数据库中,索引会在等待几分之一秒与完成复杂查询的天数之间产生差异。
btw- B树不是一个简单易懂的数据结构,遍历算法也很复杂。此外,遍历甚至比您将找到的大多数代码更加丑陋,因为在数据库中,它们不断地从磁盘加载/卸载数据块并在内存中管理它,这显着地增加了代码。但是,如果您熟悉binary search trees,那么我认为您已经足够了解这个概念。
答案 1 :(得分:5)
嗯,这取决于数据的存储方式以及您要做的事情。
k
级别可以存储在RAM中,并且只有少数底层将存储在磁盘上并且需要为每个级别读取磁盘。O(1)
磁盘访问(这通常是处理数据库时的瓶颈),因此它应该相对较快。
以上所有的缺点是它需要一个密钥 - 即如果根据关系的字段“id”构建哈希表或B +树,然后根据“密钥”进行搜索 - 它变得无用。
如果你想保证快速搜索关系的所有字段 - 你将需要几个结构,每个结构根据不同的密钥 - 这不是非常有效的内存。
现在,根据具体用法有许多优化需要考虑。例如,如果预计搜索次数非常少(比如总操作数的loglogN较小),那么维护B +树总体上效率低于仅将元素存储为列表并且在极少数情况下搜索 - 只需执行线性搜索。
答案 2 :(得分:1)
非常有问题,但它可以有很多答案,具体取决于你的表格结构以及规范化程度......
通常在SELECT
查询中执行seacrh,DBMS对表进行排序(它使用mergesort,因为此算法适用于光盘中的I / O,而不是快速排序)然后取决于索引(如果表有)它只是匹配数字,但如果结构更复杂,DBMS可以在树中执行搜索,但这太深了,让我在我的笔记中再次研究。
我建议在Sql Server 2008中激活查询执行计划here is an example,然后执行带有WHERE子句的SELECT语句,然后您就可以开始了解内部发生了什么。 DBMS。