mysql算法问题--大流量下找不同点

softwang163 2012-02-10 03:39:21
有两张表a,b里面的数据结构一摸一样,每张表都有5千万条,其中a,b有一条数据有问题,其他一摸一样,如何用高算法找出这条内容??求sql语句,小弟弄了好多,一直不行啊。
...全文
120 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
softwang163 2012-02-20
  • 打赏
  • 举报
回复
谢谢各位的回答,

其实这个问题,我知道用什么算法来最优化,但是在mysql下,我不知道有没有这样的机制去运行。
后来我看了mysql下的过程(以前以为不重要,就不太看),找到了我的答案。

解题关键,找出优化的特点(两张表一摸一样,只有某条数据不同)

1.用12楼的方法先找出哪个列不同,再来对相应列来操作。
2.就用到过程,对数据进行对比查看,找出不同点。

oO寒枫Oo 2012-02-20
  • 打赏
  • 举报
回复
写个简单的过程 按照id分批 50万 50万一次的对比 对比的脚本就用3楼的
liuxinran819 2012-02-20
  • 打赏
  • 举报
回复
楼主的意思是用存储过程的游标每次分别从两个表里面取一条数据,然后对比,对吗?好办法~
Rotel-刘志东 2012-02-19
  • 打赏
  • 举报
回复
效率高一点的用exists
liuxinran819 2012-02-18
  • 打赏
  • 举报
回复
不好意思 纠正一下 第十行括号里面的内容改成"某个索引包含的一个列也可以"~
liuxinran819 2012-02-18
  • 打赏
  • 举报
回复
首先对两个表分别进行一次全表扫描,目的是找出不一致的列.方法是类似于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的语句.
上面的这些都是为了利用覆盖索引,最后两种情况没有办法利用覆盖索引,非常无奈.
softwang163 2012-02-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 liangmapi 的回复:]

引用 6 楼 acmain_chm 的回复:

引用首先感谢您的回答,如果是这样的,我怎么还会问吗??对不起了,低估了你的水平。 在回答问题,虽然尽可能依据所描述的问题情况去猜测提问者的水平能力,但毕竟不可能都猜中。 不可否认在CSDN上的提问者从入门级到到大师级都存在。 而回答的时候,如果提问者不说的话,只能按平均水平来猜测提问者的意图。



问题说明越详细,回答也会越准确!参见……
[/Quote]湿湿的
softwang163 2012-02-14
  • 打赏
  • 举报
回复
施工队
rucypli 2012-02-10
  • 打赏
  • 举报
回复
高效率的话就是用exists 如果考虑到怕影响线上业务 可以导出这两个表到本机 5千万也就五百兆左右数据
softwang163 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 acmain_chm 的回复:]

引用首先感谢您的回答,如果是这样的,我怎么还会问吗??对不起了,低估了你的水平。 在回答问题,虽然尽可能依据所描述的问题情况去猜测提问者的水平能力,但毕竟不可能都猜中。 不可否认在CSDN上的提问者从入门级到到大师级都存在。 而回答的时候,如果提问者不说的话,只能按平均水平来猜测提问者的意图。



问题说明越详细,回答也会越准确!参见如何提问。(提问的智慧)
[/Quote]

呵呵,其实我隐含的说了,两张表都是5千万级别的,谢谢您的“提问的智慧”
ACMAIN_CHM 2012-02-10
  • 打赏
  • 举报
回复
[Quote]首先感谢您的回答,如果是这样的,我怎么还会问吗??[/Quote]对不起了,低估了你的水平。 在回答问题,虽然尽可能依据所描述的问题情况去猜测提问者的水平能力,但毕竟不可能都猜中。 不可否认在CSDN上的提问者从入门级到到大师级都存在。 而回答的时候,如果提问者不说的话,只能按平均水平来猜测提问者的意图。



问题说明越详细,回答也会越准确!参见如何提问。(提问的智慧
softwang163 2012-02-10
  • 打赏
  • 举报
回复
看来只有请出csdn的数据库老祖或是dba了
softwang163 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 acmain_chm 的回复:]

引用1.a,b两张表的一个id不一样了,
考虑到效率,使用EXISTS判断
SQL code
select * from a where not exist(select 1 from b where id=a.id)



引用2.id全部都一样,可能其中的某个关键字段不一样了。字段表示为column1.
SQL code
select *
from a ,b
where a.……
[/Quote]

首先感谢您的回答,如果是这样的,我怎么还会问吗??
ACMAIN_CHM 2012-02-10
  • 打赏
  • 举报
回复
[Quote]1.a,b两张表的一个id不一样了,[/Quote]
考虑到效率,使用EXISTS判断
select * from a where not exist(select 1 from b where id=a.id)



[Quote]2.id全部都一样,可能其中的某个关键字段不一样了。字段表示为column1.
[/Quote]
select *
from a ,b
where a.id=b.id
and a.column1!=b.column1
softwang163 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zuoxingyu2012 的回复:]

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

分下面几种情况:
1.a,b两张表的一个id不一样了,
2.id全部都一样,可能其中的某个关键字段不一样了。字段表示为column1.
珠海-天堂 2012-02-10
  • 打赏
  • 举报
回复
错误的这条有什么特点?
你是SQL是怎么查询的?

57,063

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧