有关mysql的一些小技巧
1. 大批量乱序数据导入innodb很慢如何解决?
innodb因为主键聚集索引的关系,如果没有主键或者主键非序列的情况下,导入会越来越慢,如何快速的迁移数据到innodb?借助myisam的力量 是很靠谱的,先关闭innodb的buffer pool,把内存空出来,建一张没有任何索引的myisam表,然后只管插入吧,concurrent_insert=2,在文件末尾并发插入,速度刚刚 的,插入完成后,alter table把索引加上,记得还有engine=innodb,就把myisam转到innodb了,这样的速度远比直接往innodb里插乱序数据来得快。
2. 在基于row的双master复制下,如何快速大批量订正?
在a<->b的双master结构下,假设只有一台提供服务,这是我们常用的架构,需要大批量订正数据,如何做最快?用存储过程一批批提交?这有很多的限制,有时候并不可以把一条或多条sql拆成几段,怎么办呢?binlog不是很好的工具嘛?! row格式的binlog,slave在应用时是直接使用handler api,并没有走sql解析,速度非常快,基本上是io操作了,那么我们可以在备库上直接执行订正sql,产生的row binlog传到主机,就会很快订正完,基本上都比写存储过程快。
3. row格式replication如何实现不带库名的replicate-do-db?
虽然mysql有replicate-do-db这个参数,但是在row格式的binlog下必须使用”db.table”的方式才能生效,use对row格式是无效的。现在我有一个instance,只需要复制master的某几个库,但是是row格式,sql都 没有使用db前缀,怎么办?可以这么做,把主库需要的库导出来,不需要的库导出结构即可,在slave导入这些数据及结构,配置skip-slave- errors=all,这样master复制过来的binlog,只要发现有库有表结构,就不会报找不到表,就不会阻塞复制,但是 update/delete过来没有数据也会被跳过错误,间接的实现了replicate-do-db。
4. a<–>b–>c–>d结构切换到a<–>b, c<–>d结构出现slave_lag一直增常如何避免?
这种情况常见与一个双master集群分离出一套双master集群,例如从原集群分离一部分库。过快的切换b–>c到c<–>d容易导致主备出现slave_lag,并且一直增长,原因在于a<–>b集群产生的sql,随同server_id带到了c–>d这个m-s中,当a,b产生的sql在c,d还没消化完成就change master为c<–>d时,会导致这写sql在c,d之间来回传输,因为c,d都认为这个sql不是自己产生的,因而不销毁,自己执行后写入binlog,于是slave_lag就一直增长。
避免的方法很简单,部分写切到c后,先断开b–>c的复制,等一会,看d上已经没有slave_lag了,再change master为c<–>d,这样a,b传过来的sql都消化完了。
5. 表中存在很多重复数据时,如何删除这些重复数据最快?
在需要给表中某些字段加唯一索引时,而字段中又存在需要重复清理数据的问题,不少dba都应该遇到过。一般在处理时总是想在数据库中只保留一条,其他的删除,但是这样的sql写出来总是效率不高,怎么办?其实可以转换思路,把重复的都选出一条出来,存到一张临时表,然后删除原表中所有存在重复的,再把临时表的数据库全部插入原库,这是比较通用并且高效的做法。