暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL优化20招-V3

原创 毛毛虫 2023-07-05
177

十一、操作delete或者update语句,加个limit或者循环分批次删除
1、降低写错SQL的代价清空表数据可不是小事情,一个手抖全没了,删库跑路?如果加limit,删错也只是丢失部分数据,可以通过binlog日志快速恢复的。
2、SQL效率很可能更高SQL中加了 limit 1 ,如果第一条就命中目标 return , 没有 limit 的话,还会继续执行扫描表。
3、避免长事务delete 执行时,如果 age 加了索引,MySQL会将所有相关的行加写锁和间隙锁,所有执行相关行会被锁住,如果删除数量大,会直接影响相关业务无法使用。
4、数据量大的话,容易把CPU打满如果你删除数据量很大时,不加 limit限制一下记录数,容易把cpu 打满,导致越删越慢。
5、锁表一次性删除太多数据,可能造成锁表,会有lock wait timeout exceed的错误,所以建议分批操作。

十二、UNION操作符UNION 在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION 。如:select username,tel from userunionselect departmentname from department
这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。推荐方案:采用 UNION ALL 操作符替代 UNION ,因为 UNION ALL 操作只是简单的将两个结果合并后就返回。

十三、批量插入性能提升
1、多条提交INSERT INTO user (id,username) VALUES(1,‘哪吒编程’);INSERT INTO user (id,username) VALUES(2,‘妲己’);
2、批量提交INSERT INTO user (id,username) VALUES(1,‘哪吒编程’),(2,‘妲己’);
3、理由默认新增SQL有事务控制,导致每条都需要事务开启和事务提交,而批量处理是一次事务开启和提交,效率提升明显,达到一定量级,效果显著,平时看不出来。

十四、表连接不宜太多,索引不宜太多,一般5个以内
1、表连接不宜太多,一般5个以内
1. 关联的表个数越多,编译的时间和开销也就越大
2. 每次关联内存中都生成一个临时表
3. 应该把连接表拆开成较小的几个执行,可读性更高
4. 如果一定需要连接很多表才能得到数据,那么意味着这是个糟糕的设计了
5. 阿里规范中,建议多表联查三张表以下
2、索引不宜太多,一般5个以内
1. 索引并不是越多越好,虽其提高了查询的效率,但却会降低插入和更新的效率;
2. 索引可以理解为一个就是一张表,其可以存储数据,其数据就要占空间;
3. 索引表的数据是排序的,排序也是要花时间的;
4. insert 或 update 时有可能会重建索引,如果数据量巨大,重建将进行记录的重新排序,所以建索引需要慎重考虑,视具体情况来定;
5. 一个表的索引数最好不要超过5个,若太多需要考虑一些索引是否有存在的必要;

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论