Mysql 如何查找具有数百万条记录的暂存表和主表之间的重复项

Mysql 如何查找具有数百万条记录的暂存表和主表之间的重复项,mysql,sql,Mysql,Sql,我正在使用mysql,我想检查两个表之间的重复行。我使用了join,但它占用了太多的时间,因为有数百万条记录,例如,暂存表有800k条记录,而主表有大约1亿条记录 我使用的查询如下: INSERT INTO tblspduplicate SELECT T2.SP,T1.FileImportedDate,T2.XYZFileName FROM tblspmaster T1 INNER JOIN tblstaging T2 ON T1.SP=T

我正在使用mysql,我想检查两个表之间的重复行。我使用了join,但它占用了太多的时间,因为有数百万条记录,例如,暂存表有800k条记录,而主表有大约1亿条记录

我使用的查询如下:

INSERT INTO 
    tblspduplicate
SELECT 
    T2.SP,T1.FileImportedDate,T2.XYZFileName 
FROM  
    tblspmaster T1
INNER JOIN 
    tblstaging T2 
ON 
    T1.SP=T2.SP;

CREATE TABLE `tblspmaster` (
  `CSN` bigint(20) NOT NULL AUTO_INCREMENT,
  `SP` varchar(50) NOT NULL,
  `FileImportedDate` date NOT NULL,
  `XYZFileName` varchar(50) NOT NULL,
  `XYZBatch` varchar(50) NOT NULL,
  `BatchProcessedDate` date NOT NULL,
  `ExpiryDate` date NOT NULL,
  `Region` varchar(50) NOT NULL,
  `FCCity` varchar(50) NOT NULL,
  `VendorID` int(11) NOT NULL,
  `LocationID` int(11) NOT NULL,
  PRIMARY KEY (`CSN`)
) ENGINE=InnoDB AUTO_INCREMENT=7484570 DEFAULT CHARSET=latin1;


CREATE TABLE `tblstaging` (
  `CSN` bigint(20) NOT NULL AUTO_INCREMENT,
  `SP` varchar(50) NOT NULL,
  `FileImportedDate` date NOT NULL,
  `XYZFileName` varchar(50) NOT NULL,
  `XYZBatch` varchar(50) NOT NULL,
  `BatchProcessedDate` date NOT NULL,
  `ExpiryDate` date NOT NULL,
  `Region` varchar(50) NOT NULL,
  `FCCity` varchar(50) NOT NULL,
  `VendorID` int(11) NOT NULL,
  `LocationID` int(11) NOT NULL,
  PRIMARY KEY (`CSN`),
  KEY `ind_staging` (`SP`)
) ENGINE=InnoDB AUTO_INCREMENT=851956 DEFAULT CHARSET=latin1;

也许你可以使用INTERSECt SQL,但我现在不知道他能花多少时间。

你在tblspmaster.SP上有索引吗?这将是最重要的事情。有了这样一个索引,您的查询应该就可以了。不过,首先,只使用select命令测试查询

您可能遇到的另一个问题是重复匹配。这可能会大大增加您拥有的数据。您可以通过执行以下操作进行测试:

select sp, count(*) as cnt
from tblmaster
group by sp
having cnt > 1
order by cnt desc;

编辑:

基于表结构,我重复创建tblMasterSP索引的建议。您可能还需要删除tblStagingSP上的索引。或者,您可以通过使用索引提示强制使用主索引而不是暂存索引,简单语法如下所述


而且,我建议您运行上述计数,以查看由于SP值的多重性而导致意外获得大量行的风险。

MySQL不支持INTERSECT。已经有一个名为CSN的列,它是自动递增的,需要将该列作为键。我在该列名SP上有唯一的索引以确保SP在此表中始终保持唯一。@rahularyansharma。如果两个表中的SP上都有唯一索引,则select查询应该具有合理的性能。我已删除了唯一索引,但仍然需要花费大量时间。我是否也应将我的两个表架构粘贴到此处。您好,先生,可以吗?编辑您的问题并发布表的架构,以及它们的附加索引(如果有)。
select sp, count(*) as cnt
from tblstaging
having cnt > 1
order by cnt desc;