如何加速MySQL中两个表的比较

时间:2012-04-03 07:46:24

标签: mysql indexing

我在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是两个表中的公共列。

有关如何加快速度的建议吗?

5 个答案:

答案 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应该在两个表中编入索引以帮助提高这些查询的效率。