-1

假设我有一个包含 10M enries 的表,当我有这个查询时:

SELECT column_name, count(column_name)
FROM my_table
GROUP BY column_name

需要很长时间才能完成。如果我知道 column_name 将具有给定的范围,并将我的查询拆分为不同的查询,其中每个查询如下所示:

SELECT column_name, count(column_name)
FROM my_table
WHERE column_name BETWEEN value_a AND value_b
GROUP BY column_name

我设法让它反应更快。例如,通过检查时间,如果将其拆分为 10 个查询,则每个查询的响应速度快 10 倍。

所以,我想,施加这个范围会让我的查询更快。

但是,在另一个表上,具有相似的键和列,情况并非如此。无论我是否有两者之间的时间,都需要同样的时间。

需要注意的一些事情是:

  • 第一个 DB 是 SQL,第二个是 IBM DB
  • 在第一种情况下,时间由我执行查询的 UI 工具测量,第二次在 unix 中按时间测量。
  • 我不是在比较时间,我只是对使用 between 是否可以减少我的查询时间感兴趣?
  • column_name 不是主键,但它是主键的一部分(主键在多个列上)

所以,我的问题是,是这种情况还是真的取决于?'between' 会减少查询时间吗?

4

1 回答 1

1

我的回答主要是关于 MySQL,但我发现 BETWEEN 运算符在 DB2 中也得到了优化。

您需要将 column_name 作为某个索引中的第一列,以便 BETWEEN 能够在一般情况下使用它。

在您完成计数/分组的地方,mysql 可以使用包含该列的任何索引进行全索引扫描,因为索引通常小于整个表(以要读取的数据大小)。

结果 - 如果它可以使用 BETWEEN 索引,那么添加它意味着按比例读取更少的行,这等于按比例加速(不完全是,还有一些其他开销)。由于您只使用整个表中的一列,因此对于大多数优化来说,这是“最佳”情况。其他查询的行为可能不同。但是在大多数限制性列上建立索引确实有助于处理更少的行,从而减少磁盘操作等,从而使查询更快。

学习使用EXPLAIN - 在那里您可以看到使用的索引和估计的要处理的行数以及其他信息。

于 2015-06-11T09:26:04.443 回答