最近在搬迁老项目,遇到之前好多17年的陈年老sql,一如懒婆娘的裹脚布,又臭又长,还让人看起来一头雾水。痛苦之余也总结了如下的经验。
首先,真的需要明确需求,该功能到底是要干什么,才好删繁就简。昨天遇到的一个老sql,还是查询语句,直接把cpu搞废了;
其次,Java代码要和sql相互配合,有些逻辑适合写在Java代码里,有些则适合写在sql。
最后,sql优化的一些技巧。
1、索引。
应尽量避免全表扫描,首先应考虑在 where 及 order by 涉
及的列上建立索引。索引有普通的B树索引和聚合索引。普通的索引就像是一本目录书,你要找某个物品,需要先找到目录里的地址,再去找该物品。进行了两次IO。聚集索引是缩小查询范围,就像是一个地图,我们按图索骥,找到目标所在区域。比如是一个性别字段,100w调数据,用普通索引需要访问索引50w次,再访问表50w次。虽然聚合索引可以缩短一半查询速度,但是还是不建议用。
总结,索引应加到常被分组排序 、大数目的不同值、频繁更新的列。
参考连接:
https://blog.csdn.net/londa/article/details/95582041
2、应尽量避免在 where 子句中对字段进行 null 值判断,避免使用!=或<>操作符,避免使用 or 来连接同一个字段的条件,in 和 not in 也要慎用,避免前模糊查询(即%在前),避免对字段进行操如乘除、拼接等,这些操作都会导致索引失效。
3、若查询条件字段使用了复合索引,那么必须使用到该索
引中的第一个字段作为条件时才能保证系统使用该索引,并且应尽可能的让字段顺序与索引顺序相一致。
4、尽量避免一些无意义的查询。
5、使用exists、not exists代替in、not in。
6、不要使用select * 而是用具体的字段。
7、建表时,尽可能的使用 varchar 代替 char ,因为首先变长字段存储空间小,可以节省存储空间;对于一些性别、状态等只存一个字符的字段,尽量用数字型代替字符型,以便节省内存。
8、对一些经常访问的数据要进行缓存。
独孤九剑之SQL调优
最新推荐文章于 2022-07-07 10:03:25 发布