2010-12-16 72 views
2

我有一个在MySQL的(MyISAM的)这个查询:MySQL是阻止(或如何优化本)

SELECT * FROM `links` WHERE `id` IN (SELECT `link` FROM `posts` WHERE `read_time`<'2010-10-16') 

它似乎确定了我,但MySQL的它挂断。 'links'是一个有16000行的表格,'posts'有大约5000行。 “ID”和“链接”是第一

我做了一些测试:除了一对情侣在每个表

  1. 删除所有记录。它的工作原理
  2. 执行内部查询(SELECT link FROM posts WHERE read_time < '2010-10-16')第一和执行外部查询(SELECT * FROM links WHERE id IN( '1232', '1354','3324 “))。它的工作原理
  3. 尝试升级我的Ubuntu,但它说,这是最后的MySQL版本(5.1.37-1ubuntu5.5)

发生了什么事?我发现了一个错误?或者我做错了什么?

+0

不,这不是一个错误。正如马克·拜尔斯提到的那样,一个“JOIN”会更好地工作。如果我没有记错的话,“IN”会比较所有内容,最终得出16k * 5k的比较结果。 – Bobby 2010-12-16 12:39:19

+0

发表你解释计划的答案将是不言而喻的 - 使用加入+索引 – 2010-12-16 12:39:33

回答

4

的MySQL目前不在优化这种形式的报表那么好:

SELECT * 
FROM some_table 
WHERE x IN (subquery) 

这是MySQL's bug database,它应该被固定在MySQL 5.6和MySQL 6.0。 解决您的问题,您可以使用JOIN代替IN

SELECT links.* 
FROM links 
JOIN posts ON links.id = posts.link 
WHERE posts.read_time < '2010-10-16' 

你也应该尝试read_time添加索引,如果你不已经有一个。

+1

实际上据我所知,它已被固定在5.4。将在我安装5.5后检查今天。 – Mchl 2010-12-16 12:56:22

0

除了标记Byers之外,如果可能的话,如果您尚未执行此操作,请在'read_time'上使用timestamp而不是datetime。