我在MySQL中有两个大表,一个包含大约6,00,000条记录,另一个包含大约90,000条记录。我在这两个表中有一个共同的字段,我想在此基础上比较记录。我在这个公共字段上索引了两个表,但查询执行仍需要很长时间。以下是我使用的查询:
SELECT a.url,a.title,a.description,a.jobreferenceno,a.location,a.state,
a.country,a.created_datetime,a.postalcode,a.company
FROM TABLE1 as a
WHERE EXISTS (
select b.checkfield
from TABLE2 as b where a.checkfield=b.checkfield
);
checkfield
是两个表中的公共列。
有关如何加快速度的建议吗?
答案 0 :(得分:1)
使用连接而不是子查询检查它是否更快:
SELECT a.url, a.title, a.description, a.jobreferenceno, a.location, a.state, a.country, a.created_datetime, a.postalcode, a.company FROM TABLE1 as a join TABLE2 as b on a.checkfield=b.checkfield;
答案 1 :(得分:1)
这应该更快:
SELECT a.url,a.title,a.description,a.jobreferenceno,a.location,a.state,a.country,a.created_datetime,a.postalcode,a.company
FROM TABLE1 a
LEFT JOIN TABLE2 b USING (checkfield)
WHERE b.checkfield IS NOT NULL
答案 2 :(得分:0)
由于共有一个字段,您可以使用INNER JOIN
SELECT a.url, a.title, a.description, a.jobreferenceno, a.location, a.state, a.country, a.created_datetime, a.postalcode, a.company FROM table1 a
INNER JOIN table2 b USING (checkfield)
答案 3 :(得分:0)
内部联接仅生成两个表中匹配的记录集。
SELECT a.url,a.title,a.description,a.jobreferenceno,a.location,a.state,a.country,a.created_datetime,a.postalcode,a.company
FROM TABLE1 as a INNER JOIN TABLE2 as b ON a.name=b.name;
更多信息 - http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
答案 4 :(得分:0)
子查询,就像你在这里使用的EXISTS
子查询一样,在MySQL中出了名的慢。如果有机会,您应该将它们转换为JOIN
。您的示例的JOIN
查询如下所示:
SELECT a.url
,a.title
,a.description
,a.jobreferenceno
,a.location
,a.state
,a.country
,a.created_datetime
,a.postalcode
,a.company
FROM TABLE1 as a
INNER JOIN TABLE2 as b
ON a.checkfield = b.checkfield
(请注意,这与原始文件不完全相同:此处,TABLE1中与TABLE2中的多行匹配的任何行将多次返回。如果checkfield在两个表中都是唯一的,则结果将是相同的。 )
那说,目前还不清楚这是如何真正有用的 - 你不是真的在这里比较行,只是从TABLE中选择那些在TABLE2中至少有一行恰好在checkfield中具有相同值的行
(无论如何,checkfield
应该在两个表中编入索引以帮助提高这些查询的效率。