提高SELECT查询的特定度会使查询速度更快吗?

5

我有一个记录数为150,000+的相当大的表格。它有许多字段,如country_id、region_id、city_id、latitude、longitude、postal_code等。

我需要根据纬度和经度从这个表格中进行选择,没有其他条件。我的查询语句如下:

SELECT * FROM `mytable` 
  WHERE `latitude` = '$latitude' 
  AND `longitude` = '$longitude';

尽管我在从这个表中选择时的唯一标准是纬度/经度,但我想知道是否增加更多的特定性会加快查询速度,例如:

SELECT * FROM `mytable` 
  WHERE `city_id` = '320' 
  AND `latitude` = '$latitude' 
  AND `longitude` = '$longitude';

对我来说,添加更多的查询条件似乎是不符合直觉的,但同时我通过首先确保所选记录都来自我知道的一个特定城市ID,从而大幅缩小了可能结果的数量范围,接下来我将指定纬度和经度范围。

总共可能有约150k条记录,但只有约10k条来自该特定城市。

那么这样做是否明智呢?还是我只是让查询变得更加耗时了?

2个回答

6

通常情况下,在查询语句的WHERE子句中添加条件不会对执行时间产生太大影响。但是,如果您在WHERE子句中提到的字段上添加索引,可以显著提高性能。

因此,在您的示例中,如果city_id没有索引,并且您将该条件添加到WHERE子句中并在该字段上创建索引,则可能会看到显着的性能改进。


有点困惑,因为您先前说在where子句中添加条件通常不会对速度产生太大影响,然后又说如果我索引where子句中提到的所有3个字段,那么我将获得相当大的性能提升。所以为了澄清,您建议我做什么(假设这3个字段都有索引)?我应该在其他2个条件之前添加额外的city_id = 'whatever'条件吗? - user1128811
@user1128811 - 通常情况下,每当我在WHERE子句(或JOIN)中包含一个字段作为条件时,我都会确保该字段已经适当地建立了索引。这样,我就可以确保数据库服务器将扫描(小的)索引而不是(大的)表格来消除结果集中的记录。至于应该以什么顺序放置条件,这是可以通过优化器或查询分析器来考虑的任务。 - Bob Kaufman

2

添加筛选条件可能会有不同的影响,但通常更多的筛选条件可以提高性能,特别是如果列具有索引。

在您的情况下,如果您有一个包括city_id、long和lat的索引,您将获得更好的性能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接