现有超百万条的记录 有超200的Columns
两个表 结构完全一样. 有主键ID 并且建立的索引
但是里面的数据有不同的地方..
目标:
找出两个表中主键相同 但是其他任何一点不同的记录 .
最终要得出的是只要不同的哪一些数据..
比如
A
ID NAME PSW dept
1 name1 psw1 dept1
2 name 2 psw2 dept2
.
.
B
ID NAME PSW dept
1 name1 psw1 dept1
2 name 2 psw2 deptN
3 name 3 psw3 dept3
现在就是要找出这样的结果
2 dept2 deptN
两个表 结构完全一样. 有主键ID 并且建立的索引
但是里面的数据有不同的地方..
目标:
找出两个表中主键相同 但是其他任何一点不同的记录 .
最终要得出的是只要不同的哪一些数据..
比如
A
ID NAME PSW dept
1 name1 psw1 dept1
2 name 2 psw2 dept2
.
.
B
ID NAME PSW dept
1 name1 psw1 dept1
2 name 2 psw2 deptN
3 name 3 psw3 dept3
现在就是要找出这样的结果
2 dept2 deptN
WHERE B.ID IS NULL
SELECT B.* FROM B LEFT JOIN A ON A.ID=B.ID AND A.PSW=B.PSW AND A.DEPT=B.DEPT AND A.NAME =B.NAME
WHERE A.ID IS NULL
那我就还的这样不停的写下去????效率怎样呢
A.ID=B.ID AND A.PSW=B.PSW AND A.DEPT=B.DEPT AND A.NAME =B.NAME)后再COPY回来
SELECT column1,column2,...,column300 FROM
先合并两个表,并添加一个flag字段来区分哪些行属于B表;
选出拥有相同id的行(因为id是主键,覆盖索引会使这个子查询很快完成),剔除掉两个表中id字段不匹配的行;
对经过以上两步处理得到的结果集使用GROUP BY,A表和B表中完全相同的行会合并为一行并使COUNT(*)为2,没有合并的行的COUNT(*)值为1;在这些没有发生合并的行中(COUNT(*)值为1),MAX(flag)的值为1的行属于A表,MAX(flag)的值为2的行属于B表:
SELECT id,column2,...,column300,MAX(derivedtbl.flag) AS maxFlag FROM
(SELECT * ,1 AS flag FROM A
UNION ALL
SELECT * ,2 AS flag FROM B) AS derivedtbl
WHERE derivedtbl.id in
(SELECT A.id FROM A INNER JOIN B ON A.id=B.id)
GROUP BY id,column2,...,column300
HAVING COUNT(*)=1 AND maxFlag=2
在语句的最后面加上ORDER BY null,可以避免GROUP BY的默认排序行为,能加快查询执行的速度~
那些文字全是描述那条SQL语句的~
我取了4个字段来对比 结果如下 电脑2.7的CPU 2G 内存Affected rows: 0
Time: 104.375ms
8个字段的时候
Affected rows: 0
Time: 104.485ms
100个字段的时候
Affected rows: 0
Time: 125.141ms
200个字段的时候
Affected rows: 0
Time: 144.578ms
300个字段的时候
Affected rows: 0
Time: 168.984ms
这个时候好像出来的数据不对了..汗~~~