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