【问题标题】:More efficient JOIN without an index无索引更高效的 JOIN
【发布时间】:2012-12-02 14:00:35
【问题描述】:

有时我需要通过类似的方式加入两个大表

SELECT t1.x + t2.x FROM t1 JOIN t2 USING (some_unimportant_column)

这需要很长时间,因为这两个表都很大并且some_unimportant_column 上没有索引。我不想保留索引,因为它在更新期间会占用磁盘空间和时间;此外,有时我需要加入USING (another_unimportant_column)

虽然这种 JOIN 的频率不足以证明索引的合理性,但对于极其低效的计算,等待一个小时的情况并不少见。效果很好的是

  • 在一个表的列上创建索引
  • 执行 JOIN
  • 删除索引

但是手动执行此操作很乏味,并且由于 DDL 命令而导致的提交令人讨厌。

我想知道为什么数据库不能自己解决这个问题?我正在使用 mysql 并且想知道其他数据库引擎是否对此更聪明?

【问题讨论】:

  • 因为索引是一个 b-tree,如果你加入不在 b-tree 中的东西,除了遍历整个数据结构直到找到匹配之外别无选择.使用索引,您只需要几跳就可以找到合适的匹配项。如果您需要索引,请使用它。这些天磁盘很大,如果数据库接近 50GB - 很可能无论如何都必须分发它们,所以在创建如此重要的索引之前我不会三思而后行。
  • @N.B.:我知道...但是我不能提前创建所有可能的索引,因为我真的不知道下次我会加入哪个列。数据库可以很容易地估计查询将花费太长时间,并通过创建索引本身来显示一些主动性。 ;)

标签: mysql database join


【解决方案1】:

您可以使用存储过程来做到这一点。

存储过程会创建索引,运行 sql 然后删除索引。

【讨论】:

    猜你喜欢
    • 2015-05-25
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2017-07-23
    相关资源
    最近更新 更多