MySQL阻塞(或如何优化)

时间:2010-12-16 12:34:44

标签: mysql optimization ubuntu

我在mySQL(MyISAM)中有这个查询:

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

对我来说似乎没问题,但MySQL却挂断了它。 'links'是一个包含16000行的表,'posts'包​​含有5000行。 'id'和'link'是主要的

我做了一些测试:

  1. 删除每个表中除一对以外的所有记录。它的工作原理
  2. 首先执行内部查询(SELECT link FROM posts WHERE read_time&lt;'2010-10-16')并执行外部查询(SELECT * FROM {{1} } links IN('1232','1354','3324'))。它的工作原理
  3. 尝试升级我的Ubuntu,但它说这是最后一个mySQL版本(5.1.37-1ubuntu5.5)
  4. 发生了什么事?我发现了一个错误?或者我做错了什么?

3 个答案:

答案 0 :(得分: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 :(得分:1)

正如Mark Byers建议的那样,使用JOIN。 This is a very accessible introduction to JOINs。您也可以咨询MySQL's documentation on the JOIN operator

答案 2 :(得分:0)

除了Mark Byers之外,如果你还没有这样做,可以在'read_time'上使用timestamp而不是datetime。