【问题标题】:How to use binary search algorithm without index in Database [closed]如何在数据库中使用没有索引的二进制搜索算法[关闭]
【发布时间】:2021-11-20 07:42:45
【问题描述】:

假设我想运行这个查询

select * 
from table 
where column_1 = 12

我知道二分查找的工作原理,也许如果我在column_1 上创建索引,dbms 将使用二分查找。

这里的问题:创建索引后如何在这种情况下使用不同的算法,是否适用?

【问题讨论】:

  • 通常优化器会尝试为一条 SQL 语句生成最优的执行计划。你为什么要改变它?
  • 有时,我只是想使用二分搜索,不想创建更多索引,顺便说一句,约束和索引会减慢插入速度,因为检查和维护它们的成本不是免费的
  • 系统中是否有索引会导致性能下降,或者这是一种过早优化的尝试?如果索引维护或整体查询性能存在实际问题,您最好询问该问题而不是一般问题。您说,您了解二进制搜索,其中还包括使用二进制搜索的要求。现在的问题是,您是否在任何地方都拥有无需索引的二进制搜索的数据结构?
  • 不,我之前在插入时遇到了问题(花费了更多时间),当时我们在表上创建了一些约束和索引,所以我们在加载之前和之后删除这些索引。
  • 这是数据仓库中的一种常用方法,只要您不处理实时数据,它就可以正常工作。如果它正在工作并满足需求,请不要触摸它。还要注意,约束还有助于数据库引擎做出决定(例如,当存在并强制执行外键时,引擎知道某些连接将以非常可预测的方式工作并且可以采取捷径),检查约束可以帮助解决在哪里某些场景中的条件等。当然,在 CRUD 操作期间维护这些需要资源

标签: sql database algorithm data-structures


【解决方案1】:

SQL 是一种声明性语言,意思是,你定义你想要实现的目标,但它应该如何完成是由数据库引擎决定的。

在某些情况/产品中,您可以强制执行该行为,但通常使用什么算法来获得结果不受用户控制。

大多数数据库引擎会尝试以最佳方式获得所需的结果,这是由引擎根据它所拥有的关于查询和基础数据的信息来确定的。

索引通过提供有关可能值、它们的选择性等信息来帮助数据库引擎理解数据,但最终数据库引擎将决定是否使用索引。

假设您在存储用户详细信息的表上有一个索引。索引本身位于“created_at”列上,这是创建记录的时间。 现在让我们说,您于 2019 年 9 月 1 日开始开展业务。现在,如果您有这样的查询:SELECT * FROM users WHERE created_at > '2019-01-01',数据库引擎可以使用索引,但所有记录都将匹配 where 条件,因此引擎很可能会决定迭代聚集键,而不是使用索引,因为寻找索引,比查找所有记录需要更多的资源,而不是简单地读取整个表。 但是,如果您使用不同的日期(例如 2021-09-01)执行查询,则很可能会使用该索引。

【讨论】:

  • 感谢您的回答和对引擎工作原理的澄清
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 2012-03-19
相关资源
最近更新 更多