SELECT查询很慢(不需要索引),为什么这么慢?

时间:2010-10-29 18:48:06

标签: sql mysql

我有一张超过100万条的表格。

问题在于SELECT查询的速度。这个很快:

SELECT * 
  FROM tmp_pages_data 
 WHERE site_id = 14294

Showing rows 0 - 29 (1,273,042 total, Query took 0.0009 sec)

这个很慢:

SELECT * 
  FROM tmp_pages_data 
 WHERE page_status = 0

Showing rows 0 - 29 (15,394 total, Query took 0.3018 sec)

仅在id列上有一个索引,在任何选择中都不需要。所以 site_id或页面状态没有索引。

0.30秒的查询非常令人不安,尤其是当有数千个请求时。

那怎么可能呢?我该怎么做才能看到什么减慢了它?

2 个答案:

答案 0 :(得分:5)

  

我该怎么做才能看到什么减慢了它?

很明显是什么减慢了它 - 因为你已经指出你在page_status列上没有索引,而你应该有一个索引。

唯一的惊喜是你的第一个查询没有索引就这么快。更仔细地看一下,无论您运行这些查询的客户端是什么,都会添加一个您未在问题中显示的隐式LIMIT 30。因为有很多行匹配它不需要很长时间才能找到它们中的前30个,此时它可以停止搜索并返回结果。但是,第二个查询返回的匹配行数较少,因此查找它们需要更长的时间。添加索引可以解决此问题,并使您的查询几乎立即。

简答:在page_status列上添加索引。

答案 1 :(得分:2)

好的,从我们在评论中的讨论中我们现在知道db以某种方式知道第一个查询将返回所有行。这就是为什么它如此之快。

第二个查询很慢,因为它没有索引。 OMG Ponies已经声明正常指数不起作用,因为设定的值太小。我只想指出'位图索引'。我自己还没有使用它们,但我们知道它们的设计恰好就是这种情况。