1、引言
小屌丝:鱼哥, 请问,如何防止我手抖, 误删库。
小鱼:看样子你今天是来搞事情!
小屌丝:我就是为了防止自己手抖…颤抖…
小鱼:请问一个妹子去药店,问医师要"后悔药",知道是啥不?
小屌丝:额,鱼哥,果然是老司机啊, 你这要飙车了~
小鱼:扯淡, 我就是联想一下而已…而已…
扯远了,不过,别说,还真有后悔药,就是防止 删库, 蹲牢的那种。
今天我们来搞一搞 MySQL的后悔药
2、5种后悔药
2.1 limit
我们在执行delete 或者update操作时, 如果不是十**(被)分(逼)把(无)握(奈)**,
还是在语句的最后,加上个 limit。防止 看铁窗
执行语句
delete from tesst_table where username != '小明' limit 100;
小明 从小就是明星。
好处
.降低写错SQL的代价
如果不添加limit,可能删除所有数据,如果添加limit,则指删除100条;
SQL执行效率提高
如果第一条就命中目标 return, 没有 limit 的话,还会继续执行扫描表
避免了长事务
delete 执行时,如果 age 加了索引,MySQL 会将所有相关的行加写锁和间隙锁,所有执行相关行会被锁住,如果删除数量大,会直接影响相关业务无法使用。
避免因为执行大数据量,把CPU顶满
如果你删除数据量很大时,不加 limit 限制一下记录数,容易把 CPU 打满,导致越删越慢的(小鱼就干过一次这事)。
2.2 先测试后生产
以下三点,很重要:
变更 SQL 操作先在测试环境测试,避免有语法错误就放到生产上了
变更 SQL 操作需要写明详细操作步骤,尤其有依赖关系的时候,如:先修改表结构再补充对应的数据。
变更 SQL 操作要有回滚方案,并在上生产前,review 对应变更 SQL。
2.3 删除前,先备份
为了防止看铁窗,咱们还是按规矩来:
修改或者删除数据,在执行sql前,一定要备份…备份…备份…
如果删数据, 不备份,想想都有啥后果:
轻则 boss “指导” 你
重则 牢头 “指导” 你
2.4 删除前,先查询
修改或者删除数据,在执行sql前,一定要where一下,确认是自己想要的,然后再delete 或者update
2.5 修改时, begin+commit
在执行SQL修改数据时, 建议 使用begin + commit事务的习惯
例子:
begin: update test_table set sort = 100000 where ext_name like '%小明'; commit:
3、 总结
小屌丝:鱼哥, 有了这5种后悔药, 再也不怕自己手抖了
小鱼: 养成好习惯,不仅方便他人,还方便自己。
小屌丝:鱼哥, 那有没有MySQL 优化的内容呢?
小鱼: 有啊 ,难道你不记得,我专门写过这篇MySQL优化?
就是这篇《关于MySQL性能优化方式,这一篇就够!》。
而MySQL专栏,又包含:
SQL的基本用法一、二
SQL+Python定时备份
sql的去重方法
SQLyog快捷键使用总结
sql数据库中的 delete 与drop的区别
深聊MySQL,从入门到入坟之:如何优化数据导入
深聊MySQL,从入门到入坟之:如何让order by、group by查询速度飞起来
由于今天是农历腊月二十八,最后小鱼一句话总结这一年的搬砖感言:
退一步万丈深渊,进一步海阔天空!