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

如何在MySQL中加速两个表的比较,mysql,indexing,Mysql,Indexing,我在MySQL中有两个大表,一个包含约60000条记录,另一个包含约90000条记录。我在这两个表中有一个公共字段,我想在此基础上比较记录。我在这个公共字段上为两个表编制了索引,但查询执行仍然需要很长时间。以下是我使用的查询: SELECT a.url,a.title,a.description,a.jobreferenceno,a.location,a.state, a.country,a.created_datetime,a.postalcode,a.company FROM TAB

我在MySQL中有两个大表,一个包含约60000条记录,另一个包含约90000条记录。我在这两个表中有一个公共字段,我想在此基础上比较记录。我在这个公共字段上为两个表编制了索引,但查询执行仍然需要很长时间。以下是我使用的查询:

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


关于如何加快速度有什么建议吗?

因为有一个共同的字段,所以可以使用内部联接


检查使用联接而不是子查询是否更快:

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;

这应该更快:

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

内部联接只生成两个表中匹配的记录集

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;
更多信息-

子查询,就像您在这里使用的EXISTS子查询一样,在MySQL中速度非常慢。如果有机会,您应该将它们转换为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
请注意,这与原来的不完全相同:在这里,表1中与表2中的多行匹配的任何行都将被多次返回。如果checkfield在两个表中都是唯一的,则结果将是相同的

这就是说,不清楚这到底有什么帮助-这里并不是真正比较行,只是从表2中至少有一行恰好在checkfield中具有相同值的表中选择这些行


无论如何,应在两个表中对checkfield进行索引,以帮助提高a.commonfield=b上这些查询的效率。commonfield可以使用commonfield编写是的,这相当于OP的查询,但为什么要使用左联接?由于b.checkfield不是NULL条件,因此结果将与使用简单的内部连接时的结果相同是的,但根据我的经验,尤其是在mysql上,这种带有过滤器的外部连接比内部连接执行得更快。OP可以测试它,但在大型表上应该更快…感谢您的帮助。我是新加入的,你能建议我如何查询从表1中选择a.url、a.title、a.description、a.jobreferenceno、a.location、a.state、a.country、a.created\u datetime、a.postalcode、a.company作为a不存在从表2中选择b.checkfield作为b其中a.checkfield=b.checkfield使用加入编写。谢谢罗兰。是的,我想从表1中选择与表2中匹配的行。我不确定我的表中的checkfield列是否是唯一的,因此我得到的记录数比预期的要多。有没有一种方法可以使用连接获得我在原始查询中想要的结果?再次感谢您的时间:如果联接返回的行数比表1中的多,那么您可以确保checkfield不是唯一的。当然,我不知道这是否可以,你应该知道。要仅返回表1中唯一的行,可以在SELECT关键字后面添加DISTINCT。但是,仍然不清楚您想对结果做什么,如果您想真正比较表1和表2中的行,DISTINCT可能不合适。我想从结果中得到的是,我想将表1和表2中存在的记录插入另一个表中,以便对其进行进一步处理。Deepak,这里发生了一些奇怪的事情。您说希望将两个表中的行插入到另一个表中,但问题是表2显然可以包含多个这样的行。不管怎样,就像我说的,使用SELECT DISTINCT。。。仅从表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 
INNER JOIN TABLE2 as b 
ON         a.checkfield = b.checkfield