【发布时间】: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.:我知道...但是我不能提前创建所有可能的索引,因为我真的不知道下次我会加入哪个列。数据库可以很容易地估计查询将花费太长时间,并通过创建索引本身来显示一些主动性。 ;)