【问题标题】:Time complexity of a SQL select query with multiple conditions [closed]具有多个条件的 SQL 选择查询的时间复杂度 [关闭]
【发布时间】:2013-01-03 17:57:20
【问题描述】:

涉及多个条件的 SQL 选择查询的时间复杂度是多少?

SELECT * 
  FROM products 
 WHERE price > 100 
   AND width > 100 
   AND rating > 100

例如,数据库引擎 (InnoDB) 如何处理这个带有价格、宽度和评级索引的查询?

引擎会先处理价格,然后按宽度和评级过滤结果吗?这意味着首先 O(log(n)+k) 其中 k 是结果数,n 是 products 表中的条目数, 然后是O(n),然后是O(n),n是最后一次过滤操作的结果数??

【问题讨论】:

  • 太宽泛,没有特定的数据库(包括版本)。即便如此,这也取决于™。
  • @OMGPonies +1 商标。
  • @LibertPiouPiou 你不能说第一个是 O(log(n))。例如,如果所有行都有price > 100,那么它必须是 O(n)。
  • 最新版本的 InnoDB @OMG Ponies
  • @svick 我刚刚编辑了我的问题

标签: sql data-structures complexity-theory b-tree


【解决方案1】:

您基本上是在问 SQL 优化器是如何工作的,正如所指出的,它因 SQL 版本而异,并且取决于。

一般而言(非常广泛),优化器会保留有关表的元数据,以便它可以选择哪个索引有意义。例如,如果一个表包含学生性别和 GPA,您会期望优化器始终使用 GPA 上的索引。但是,如果您在一所全是男性的学校运行查询并搜索女性,优化器可能会意识到先搜索性别列会更快(因为返回的记录很少)。此外,如果您的表非常小,优化器可能会说,“见鬼的索引,我只会扫描整个该死的表”....

在您的示例中,考虑有多少不同的值。该列都是整数吗?如果是这样,优化器可以查询元数据并说“嗯,只有 300 行的评级超过 100,而 10,000 行的价格超过 100,我想我会使用评级开始”...... .

但是,正如 OMG 小马指出的那样,这取决于...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2015-03-30
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    相关资源
    最近更新 更多