一、mysql 如果出现主从数据不一致情况怎么弄
1、用 pt-table-checksum时,会不会影响业务性能?

2、实验开始前,给大家分享一个小经验:任何性能评估,不要相信别人的评测结果,要在自己的环境上测试,并(大概)知晓原理。
3、然后用 mysqlslap跑一个持续的压力:
4、开另外一个会话,将 master上的 general log打开:
5、然后通过 pt-table-checksum进行一次比较:
6、查看 master的 general log,由于 mysqlslap的影响,general log中有很多内容,我们找到与 pt-table-checksum相关的线程:
7、操作比较多,我们一点一点来说明:
8、这里工具调小了 innodb锁等待时间。使得之后的操作,只要在 innodb上稍微有锁等待,就会马上放弃操作,对业务影响很小。
9、另外工具调小了 wait_timeout时间,倒是没有特别的作用。
10、工具将隔离级别调整为了 RR级别,事务的维护代价会比 RC要高,不过后面我们会看到工具使用的每个事务都很小,加上之前提到 innodb锁等待时间调到很小,对线上业务产生的成本比较小。
11、工具通过一系列操作,了解表的概况。工具是一个数据块一个数据块进行校验,这里获取了第一个数据块的下边界。
12、接下来工具获取了下一个数据块的下边界,每个 SQL前都会 EXPLAIN一下,看一下执行成本,非常小心翼翼。
13、之后工具获取了一个数据块的 checksum,这个数据块不大,如果跟业务流量有冲突,会马上出发 innodb的锁超时,立刻退让。
14、以上是 pt-table-checksum的一些设计,可以看到这几处都是精心维护了业务流量不受影响。
15、工具还设计了其他的一些机制保障业务流量,比如参数--max-load和--pause-file等,还有精心设计的数据块划分方法,索引选择方法等。大家根据自己的情况配合使用即可达到很好的效果。
16、本期我们介绍了简单分析 pt-table-checksum是否会影响业务流量,坊间会流传工具的各种参数建议或者不建议使用,算命的情况比较多,大家都可以用简单的实验来分析其中机制。
17、还是那个观点,性能测试不能相信道听途说,得通过实验去分析。
二、mysql如何实现两个表的数据差异查询
1、查询两张表数据不一致的记录,可以用求差集(非交集)的办法来解决。
2、SQL语言求"差集"的办法相对于求"交集"的办法要少很多,一般可用not exists(非存在子句)或左(右)连接后所产生空字段值来筛选两表的差集。
3、选出a表中与b表中id不一致的记录
4、select a.* from a where not exists(select 1 from b where b.id=c.id);
5、说明:上述语句只比对id一个字段,我们可以根据需要比对多个字段。not exists在比对字段有可利用的索引时,其运行效率是非常高,但是如果没有索引的情况下运行在大数据表时,其运行效率极差,这时应避免使用它,这时我们可改用左(右)连接来求差集。
6、下面是用左连接来求差集的例子:
7、select a.* from a left join b on a.id=b.id where b.id is null;
8、用左(右)连接来求差集,由于需要实施两表连接会导致笛卡尔效应其输出集的记录行可能会增多,若果不是一对一或一对多,我们应该将多对多的情况处理成多对一后才进行连接,否则输出的记录集可能不正确。
9、求差集的两种方法,有索引可利用时,not exists的效率要高于left join,反之left join效率更好。
三、mysql 判断两个数组是否有交集
1、在PHP中求数组的交集,我们可以与PHP给我们提供的现成函数:array_intersect(),其用法格式为:
2、array array_intersect(array array1,array array2[,arrayN…])
3、根据上述的语法格式,我们来写一个例子:
4、2$fruit1= array("Apple","Banana","Orange");
5、3$fruit2= array("Pear","Apple","Grape");
6、4$fruit3= array("Watermelon","Orange","Apple");
7、5$intersection= array_intersect($fruit1,$fruit2,$fruit3);
8、本例子将返回在$fruit1数组中出现且在$fruit2和$fruit3中也出现的所有水果的名子。
9、使用array_intersect()函数时要注意:只有在两个元素相等且具有相同的数据类型时,array_intersect()函数才会认
10、为它们是相同的,否则不能进行交集计算。array_intersect()函数返回一个保留了键的数组,只由第一个数组中出现的且在其它数组中都出现的
11、若要求关联数组的交集,请使用array_intersect_assoc()函数,给你个简单的例子:
12、2$fruit1= array("red"=>"Apple","yellow"=>"Banana","orange"=>"Orange");
13、3$fruit2= array("yellow"=>"Pear","red"=>"Apple","purple"=>"Grape");
14、4$fruit3= array("green"=>"Watermelon","orange"=>"Orange","red"=>"Apple");
15、5$intersection= array_intersect_assoc($fruit1,$fruit2,$fruit3);
16、array_intersect_assoc()函数语法格式如下:
17、array array_intersect_assoc(array array1,array array2[,arrayN…])
18、array_intersect_assoc()与array_intersect()基本相同,只不过他在比较中还考虑了数组的键。因此,只有在第一个数组中出现,且在所有其他输入数组中也出现的键/值对才返回到结果数组中。
mysql交集和mysql交集和并集的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!









