mysql小技巧积累(持续更新)

一、关于NULL值

1.update null值时,格式为set col=null,不能是is null,不能是'null'。
2.mysql中,Null值不等于'',oracle中,空字符串会被当成null保存。
3.select时,mysql基于PADSPACE的校对规则,对CHAR和VARCHAR值进行比较都忽略尾部空格,需要精确匹配时可以用BINARY。
  例:select * from table where col=BINARY '';

、数据处理

1.去除重复数据:alter ignore table a add unique index(c1),给需要去重的列添加唯一索引
    IGNORE是MySQL相对于标准SQL的扩展,如果指定了IGNORE,则对于有重复关键字的行,只使用第一行,其它有冲突的行被删除。并且,对错误值进行修正,使之尽量接近正确值。
  此命令不生效的话,需要使用旧的sql模式 http://guduwhuzhe.iteye.com/blog/1762593

三、关于DISTINCT 

1.对多列去重的话,例如select distinct col1,col2,只有col1且col2都有重复时才会排重,单独某一列重复是不会排重的。


四、误删ibdata文件
如果不小心删除了MySQL的ibdata文件,也无需惊慌。切记此时不要关闭MySQL实例,因为这时MySQL还保留着文件索引节点的链接。这时仍然可以使用mysqldump做个完全备份。

、遇到的
   在线上大批量insert数据时,mysql报警出现死锁,show processlist时发现大量的insert线程在排队等待。死锁内容如下:
------------------------
LATEST DETECTED DEADLOCK
------------------------
140826 10:32:57TOO DEEP OR LONG SEARCH IN THE LOCK TABLE WAITS-FOR GRAPH, WE WILL ROLL BACK FOLLOWING TRANSACTION 


*** TRANSACTION:
TRANSACTION 3BAA73EE, ACTIVE 0 sec setting auto-inc lock
mysql tables in use 1, locked 1
1 lock struct(s), heap size 376, 0 row lock(s)
MySQL thread id 1087546, OS thread handle 0x7fdec94d2700, query id 2497449384 10.71.65.57 tiger_mobile update
insert into xxx_table values (xxx)
*** WAITING FOR THIS LOCK TO BE GRANTED:
TABLE LOCK table `xxx_database`.`xxx_table` trx id 3BAA73EE lock mode AUTO-INC waiting

google了一下,等待的事务超过200个时,会判断为死锁,并且尝试回滚。因此在线上大批量insert时要注意锁表问题。

参考资料:http://www.cnblogs.com/zemliu/p/3502395.html

、关于sql_slave_skip_counte
使用的时候,它不仅跳过出错的事务,也会跳过正常的事务,所以使用的时候要十分小心,不要贪图方便而一次性跳过N个事务。

上一篇:bbs升级至X3.2后楼层乱掉的问题修复


下一篇:不断执行的kill脚本