用于优化WHERE查询的SQL索引

时间:2016-02-19 19:32:28

标签: mysql sql postgresql

我有一个包含多个列的Postgres表,一列是上次更新列的日期时间。我的查询是在开始和结束时间之间获取所有更新的行。我对此查询的理解是在此查询中使用WHERE而不是BETWEEN。基本查询如下:

SELECT * FROM contact_tbl contact
WHERE contact."UpdateTime" >= '20150610' and contact."UpdateTime" < '20150618'

我是创建SQL查询的新手,我相信这个查询正在进行全表扫描。我想尽可能优化它。我在UpdateTime列上放置了一个Normal索引,这需要很长时间才能创建,但使用此索引时查询速度更快。我不确定的一件事是,如果表变得更大/列被更改,是否必须继续重新计算此索引。此外,我正在考虑更新时间行上的CLUSTERED索引,但我想问一下,如果我是在正确的轨道上,是否有优化这种规范的方法

1 个答案:

答案 0 :(得分:1)

在UpdateTime上放置索引是正确的。它将允许使用索引而不是全表扫描。

2以上条件与使用BETWEEN关键字的条件完全相同: http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_between

BETWEEN只是&#34;语法糖&#34;对于那些更喜欢这种语法的人。

索引允许更快的读取,但写入速度变慢(因为如您所述,新数据也必须插入到索引中)。整个索引不需要重新计算。索引是智能数据结构,因此可以添加额外的数据而无需额外的工作,但确实需要一些。

你可能会做更多的读取而不是写入,所以使用索引是一个好主意。

如果您正在进行大量写入和少量阅读,那么您需要更多地思考它。然后它将归结为业务需求。虽然整体吞吐量可能会减慢,但读取延迟可能不是必需的,但写入延迟可能是,在这种情况下,您不会想要索引。

例如,想想这个彩票示例:每当有人买票时,你必须记录他们的名字和票号。但是,您唯一需要阅读该数据的时间是在1之后,只有图纸才能看到谁拥有该票号。在这个数据库中,您不想索引票号,因为它们的写入次数很少,读取次数也很少。