msyql数据库开发设计运维规范

sql要尽可能简单,拆分

事务要简单,禁止包含非数据库操作逻辑

禁止使用SELECT *,只获取必要的字段读取多余列增加CPU、IO、NET消耗,影响性能、带宽、IO

不能有效利用覆盖索引(假如查询的列都在索引里,直接从索引获取数据,而不必再次读取数据行)

SELECT * 容易在增加删除字段等表结构变更后后出现问题

禁止使用INSERT INTO t_xxx VALUES(xxx),必须显示指定插入的列属性,容易在增加或者删除字段等表结构变更后出现程序BUG,字段顺序错乱导致的值错乱&sql报错等

禁止使用属性隐式转换

如seelct uid, name from user where phone_num = 18810231321语句不会使用索引(phone_num使用varchar存储且该列建了索引),导致全表扫描

禁止where条件的属性上使用函数或者表达式,导致索引不生效,全局扫描;在值上可以使用

如select uid from user where age - 2 > 10可改为 age > 12;

反向、负向查询以及%开头的模糊查询负向查询如NOT、!=、<>、!、NOT IN、NOT LIKE等会导致全局扫描;但如果where uid = xx and status != 1类似先执行了uid过滤后进行负向查询的话还可以

针对字符,左前缀模糊查询导致索引不生效,全表扫描;其他类型后面模糊也不走索引

禁止大表使用join查询,及使用子查询

会产生临时表,消耗内存、cpu,影响性能;避免临时表

union all不去重,少了排序操作;union去重,性能不如union all

禁止使用同一字段上的OR查询,改为IN,in也要尽量避免使用,in里个数控制在500或1000个内,OR使索引失效;不同字段的or用union all代替

应用程序要捕获sql异常,进行处理,便于定位问题

使用预编译prepared sql,防止注入,提升性能

重要sql要被索引where条件里的字段

ORDER BY、GROUP BY、DISTINCT的字段

sql语句建议全部小写,或者全部大写,小写容易读

避免使用count(*),会全表扫描,计数实时较强的场景可以用redis等分布式缓存,不强可以用单独的统计表定时更新

禁止update语句时set a = x ,b = y;写成a = x and b = y,意义不一样

尽量减少与数据库交互次数,能批量则批量,能一次不2次

insert使用batch提交时insert into table values (),()..,小于500个,根据数据量酌情定

sql语句不用不确定值函数及随机函数,如rand()、now()

减少、避免排序,group by如果不需要排序可以加order by null

多使用limit n,少用limit m,n,m比较大时影响性能

使用INSERT … ON DUPLICATE KEY update (INSERT IGNORE)或者replace语句来避免不必要的查询

尽量使用主键update、delete操作

用where子句代替having子句,having可能不同执行计划结果不同

不要一次大量删除、更新或导入导出数据,分批,太多容易出问题

多表连接查询数据量小的表的条件紧跟where语句后

count(列名)不会统计列为null的行,所以列要not null

count(distinct col1)统计col1不为null的不重复数量,列要not null

count(distinct col1, col2),col1或col2为null,则返回0,所以列要not null

count(col)若col列全为null返回0,但是sum(col)则返回null,npe异常,列要not null

sql delte update语句执行时要先select查看影响条数,及diff语句前后的影响数据
————————————————
版权声明:本文为CSDN博主「AI前线」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_29235525/article/details/113426530

posted @ 2023-08-25 15:04  小强找BUG  阅读(13)  评论(0编辑  收藏  举报