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

oka*_*bmd 2 mysql sql

我的桌子上有超过100万个条目。

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

SELECT * 
  FROM tmp_pages_data 
 WHERE site_id = 14294

Showing rows 0 - 29 (1,273,042 total, Query took 0.0009 sec)
Run Code Online (Sandbox Code Playgroud)

而且这很慢:

SELECT * 
  FROM tmp_pages_data 
 WHERE page_status = 0

Showing rows 0 - 29 (15,394 total, Query took 0.3018 sec)
Run Code Online (Sandbox Code Playgroud)

仅id列上有一个索引,任何选择都不需要。因此,没有site_id或页面状态的索引。

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

那怎么可能呢?我该怎么做才能看到速度变慢了?

Mar*_*ers 5

我该怎么做才能看到速度变慢了?

很明显,这正在减慢它的速度-正如您已经指出的,您在page_status列上没有索引,应该有一个索引。

唯一的意外是没有索引,您的第一个查询是如此之快。仔细观察一下,似乎无论您在运行这些查询的任何客户端上都添加了一个隐含的内容LIMIT 30,而您没有在问题中显示它。由于匹配的行太多,因此很快就可以找到它们的前30行,此时它可以停止搜索并返回结果。但是,第二个查询返回的匹配行较少,因此查找它们所需的时间更长。添加索引将解决此问题并使查询几乎立即进行。

简短的答案:在列上添加索引page_status