MySQL:查找两个表中匹配的记录A& B B很大

时间:2012-05-01 13:16:20

标签: mysql

以下工作正常,但速度太慢。我只需要知道表B中有匹配的记录,那么有什么技巧吗?

(奇怪的是相反的搜索:找到不加入的记录(IS NULL)非常快)

SELECT
  TableA.id
FROM
  TableA
  LEFT JOIN
    TableB 
  ON
    TableB.TableA_id = TableA.id
WHERE
  TableB.id IS NOT NULL and TableA.clientid=13 ;

现在已将Clientid编入索引,但正是这个子条款将查询从非常快的速度大幅减慢到几分钟。

(03月12日我现在在一个功能更强大的服务器上的相同数据库上尝试了同样的查询,查询需要一秒钟。所以看起来我的问题是我的原始服务器完全超载,具有讽刺意味的是上面的查询是用于识别我们可以删除的记录以减少表的大小。我将不得不在更快的服务器上重新构建数据库,清理它然后在“慢”服务器上重新生成它)

3 个答案:

答案 0 :(得分:2)

索引应该在TableB.TableA_id和TableA.id

上创建
SELECT
  Count(TableA.id)
FROM
  TableA
  JOIN
    TableB 
  ON
        TableB.TableA_id = TableA.id And TableB.id IS NOT NULL
and TableA.clientid=13 ;

答案 1 :(得分:1)

此查询查找A中同样位于B中的所有记录:

SELECT TableA.id
FROM TableA
JOIN TableB ON TableB.TableA_id = TableA.id

如果TableB.TableA_id上有索引(TableA.id上的索引与此查询的效果无关),它会表现良好。

答案 2 :(得分:0)

试试这个

SELECT TableA.id
FROM TableA
INNER JOIN TableB ON TableB.TableA_id = TableA.id

在这种情况下,由于内部连接,您不需要使用非null。希望这将是更好的解决方案