![](https://csdnimg.cn/release/download_crawler_static/86490863/bg1.jpg)
⽬的
•
优化"物理模型"(SQL设计)
•
提⾼QUERY性能
•
避免严重影响业务的SQL (有时候甚⾄⼀条SQL搞死MySQL Server)
! ! ! ! !数据库DDL变更规范请查看:数据库DDL变更规范
SQL开发规范(针对OLTP)
•
不使⽤⼤事务,拆分为⼩事务。⼤SQL拆成多个⼩SQL, 增加缓存命中率和提⾼CPU
利⽤率(降低IOWait)
•
不使⽤多表查询, 禁⽤JOIN
•
不使⽤ * , SELECT使⽤具体的列名
•
开发时不会因为使⽤*⽽显著缩短开发时间和设计时间
•
还能减少QUERY RT
•
在发⽣列的增/删时, 发⽣列名修改时, 最⼤限度避免程序逻辑中没有修改导致
的BUG
•
后续很多⼯具需要依赖于此
•
能够减少⽹络传输消耗
•
为利⽤覆盖索引进⾏优化提供可能
•
出现⼤批量操作的导数据/变更数据必须分批进⾏.!!⽐如⽰例:
•
禁⽌在MySQL Server端做运算, md5() rand() to_days等, 在索引列中作运算, ⽆法利⽤索
引
•
禁⽌IN的元素个数超过500,涉及到分⽚业务的SQL个数应少于64/128 ,建议个数:
30 or 50
•
禁⽌使⽤%前缀模糊查询,因为B+TREE ⽆法使⽤索引,将导致全表扫描
• SELETE `table` WHERE `Updated` > 20001001 LIMIT 2000
UPDATE `table` ... WHERE `Id` = ? LIMIT 1
DELETE FROM `table` WHERE `Id` = ? LIMIT 1
UPDATE `table` ... WHERE `Id` > ? LIMIT 30
DELETE FROM `table` WHERE `Id` > ? LIMIT 1000
•
•
•
错误的写法
select id from tab where id+1=5;
select id,value from tab where to_days(now())-
to_days(gmt_created) <=10;
正确的写法
select id from tab where id=5-1;
select id,value from tab where gmt_created >=
DATA_SUB(now(),interval 10 day );