添加之间加快我的SQL查询?

时间:2015-06-11 08:22:07

标签: mysql sql ibm-db2

假设我有一个包含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中执行查询。
  • 我不是在比较时间,我只是对使用之间是否会导致缩短查询时间感兴趣?
  • column_name不是主键,但它是主键的一部分(主键位于多列上)

所以,我的问题是,这是真的,还是真的取决于? 'between'会缩短查询时间吗?

1 个答案:

答案 0 :(得分:1)

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

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

你在那里完成count / group,mysql可以使用任何包含该列的索引进行全索引扫描,因为索引通常比整个表更小(在datasize中读取)。

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

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