有两张表a,b里面的数据结构一摸一样,每张表都有5千万条,其中a,b有一条数据有问题,其他一摸一样,如何用高算法找出这条内容??求sql语句,小弟弄了好多,一直不行啊。

解决方案 »

  1.   

    错误的这条有什么特点?
    你是SQL是怎么查询的?
      

  2.   


    分下面几种情况:
    1.a,b两张表的一个id不一样了,
    2.id全部都一样,可能其中的某个关键字段不一样了。字段表示为column1.
      

  3.   

    考虑到效率,使用EXISTS判断
    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
      

  4.   

    看来只有请出csdn的数据库老祖或是dba了
      

  5.   

    对不起了,低估了你的水平。 在回答问题,虽然尽可能依据所描述的问题情况去猜测提问者的水平能力,但毕竟不可能都猜中。 不可否认在CSDN上的提问者从入门级到到大师级都存在。 而回答的时候,如果提问者不说的话,只能按平均水平来猜测提问者的意图。问题说明越详细,回答也会越准确!参见如何提问。(提问的智慧
      

  6.   

    高效率的话就是用exists 如果考虑到怕影响线上业务 可以导出这两个表到本机 5千万也就五百兆左右数据
      

  7.   

    首先对两个表分别进行一次全表扫描,目的是找出不一致的列.方法是类似于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的语句.
    上面的这些都是为了利用覆盖索引,最后两种情况没有办法利用覆盖索引,非常无奈.
      

  8.   

    谢谢各位的回答,其实这个问题,我知道用什么算法来最优化,但是在mysql下,我不知道有没有这样的机制去运行。
    后来我看了mysql下的过程(以前以为不重要,就不太看),找到了我的答案。解题关键,找出优化的特点(两张表一摸一样,只有某条数据不同)1.用12楼的方法先找出哪个列不同,再来对相应列来操作。
    2.就用到过程,对数据进行对比查看,找出不同点。