我在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'是主要的
我做了一些测试:
link
FROM posts
WHERE read_time
&lt;'2010-10-16')并执行外部查询(SELECT * FROM {{1} } links
IN('1232','1354','3324'))。它的工作原理发生了什么事?我发现了一个错误?或者我做错了什么?
答案 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。