我有一张超过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秒的查询非常令人不安,尤其是当有数千个请求时。
那怎么可能呢?我该怎么做才能看到什么减慢了它?
答案 0 :(得分:5)
我该怎么做才能看到什么减慢了它?
很明显是什么减慢了它 - 因为你已经指出你在page_status列上没有索引,而你应该有一个索引。
唯一的惊喜是你的第一个查询没有索引就这么快。更仔细地看一下,无论您运行这些查询的客户端是什么,都会添加一个您未在问题中显示的隐式LIMIT 30
。因为有很多行匹配它不需要很长时间才能找到它们中的前30个,此时它可以停止搜索并返回结果。但是,第二个查询返回的匹配行数较少,因此查找它们需要更长的时间。添加索引可以解决此问题,并使您的查询几乎立即。
简答:在page_status
列上添加索引。
答案 1 :(得分:2)
好的,从我们在评论中的讨论中我们现在知道db以某种方式知道第一个查询将返回所有行。这就是为什么它如此之快。
第二个查询很慢,因为它没有索引。 OMG Ponies已经声明正常指数不起作用,因为设定的值太小。我只想指出'位图索引'。我自己还没有使用它们,但我们知道它们的设计恰好就是这种情况。