首先对两个表分别进行一次全表扫描,目的是找出不一致的列.方法是类似于select sum(id),avg(hex(name))... from tbl.具体使用哪些函数需要楼主自己斟酌,目的是尽量发现不同之处. 如果两个表的数据完全一样,那么两个查询返回的结果会完全相同;否则就是有不同. 如果不同,不同的列可能有多个,这样最好,因为给我们留下了更多的选择.假设我们的运气好,出问题的列里面包含单列唯一键,比如id列.那么我们只需要进行一次连接,使用楼上各位说的not exists语句 select id from a where not exist(select 1 from b where id=a.id) 因为我们只用了id列,所以这是覆盖索引,执行起来要快很多.查询完毕后就得到了那个不同行的id值~ 如果运气差一点,出问题的列中没有单列唯一键,而是多列唯一索引,那么方法同上,不过因为要读取多列,所以速度会慢些,但总还是覆盖索引. 如果运气更差一点,出问题的列中没有唯一键,而只有普通键(某个索引的最左前缀也可以),那就比较棘手了.但愿你使用的是InnoDB存储引擎,因为InnoDB的非主键索引中存储了主键值.假设name列是普通键,那么select id,name from tbl还是可以使用覆盖索引的.此时可以使用ACMAIN_CHM说的语句,此时仍是覆盖索引.如果不是InnoDB,那么就无奈也只能用这个语句了,区别就是无法使用覆盖索引而只好使用表扫描. 如果运气超级差,出问题的列中没有任何键,那也没办法了,还是用ACMAIN_CHM的语句. 上面的这些都是为了利用覆盖索引,最后两种情况没有办法利用覆盖索引,非常无奈.
你是SQL是怎么查询的?
分下面几种情况:
1.a,b两张表的一个id不一样了,
2.id全部都一样,可能其中的某个关键字段不一样了。字段表示为column1.
select * from a where not exist(select 1 from b where id=a.id)
select *
from a ,b
where a.id=b.id
and a.column1!=b.column1
如果两个表的数据完全一样,那么两个查询返回的结果会完全相同;否则就是有不同.
如果不同,不同的列可能有多个,这样最好,因为给我们留下了更多的选择.假设我们的运气好,出问题的列里面包含单列唯一键,比如id列.那么我们只需要进行一次连接,使用楼上各位说的not exists语句
select id from a where not exist(select 1 from b where id=a.id)
因为我们只用了id列,所以这是覆盖索引,执行起来要快很多.查询完毕后就得到了那个不同行的id值~
如果运气差一点,出问题的列中没有单列唯一键,而是多列唯一索引,那么方法同上,不过因为要读取多列,所以速度会慢些,但总还是覆盖索引.
如果运气更差一点,出问题的列中没有唯一键,而只有普通键(某个索引的最左前缀也可以),那就比较棘手了.但愿你使用的是InnoDB存储引擎,因为InnoDB的非主键索引中存储了主键值.假设name列是普通键,那么select id,name from tbl还是可以使用覆盖索引的.此时可以使用ACMAIN_CHM说的语句,此时仍是覆盖索引.如果不是InnoDB,那么就无奈也只能用这个语句了,区别就是无法使用覆盖索引而只好使用表扫描.
如果运气超级差,出问题的列中没有任何键,那也没办法了,还是用ACMAIN_CHM的语句.
上面的这些都是为了利用覆盖索引,最后两种情况没有办法利用覆盖索引,非常无奈.
后来我看了mysql下的过程(以前以为不重要,就不太看),找到了我的答案。解题关键,找出优化的特点(两张表一摸一样,只有某条数据不同)1.用12楼的方法先找出哪个列不同,再来对相应列来操作。
2.就用到过程,对数据进行对比查看,找出不同点。