mysql数据库开发规范1
•禁止跨实例访问,mysql不支持跨实例访问,实例之间访问通过业务接口调用形式。
•MYSQL默认为innodb引擎,如要使用其他引擎。例如tokudb,myrocks等,需要说明业务场景和原因。
•禁用外键、视图、触发器、存储过程、自定义函数。
mysql数据库开发规范2
•表设计参考三范式,也可考虑反范式,增加冗余数据,减少联表查询。
第三范式(Third Normal Form,3rd NF)就是指表中的所有数据元素不但要能唯一地被主关键字所标识,
而且它们之间还必须相互独立,不存在其他的函数关系。
也就是说,对于一个满足2nd NF 的数据结构来说,
表中有可能存在某些数据元素依赖于其他非关键字数据元素的现象,必须消除。
•创建表时,必须明确创建主键。可以是业务相关或者自增。主键类型需为数值型。或者使用公司内部的ID生成器生成ID。
•数据库名称,表名称必须用小写字母。命名规范,有意义。不能超过32个字符。禁止出现数字,特殊符号开头的库名和表名。
mysql数据库开发规范3
•禁止使用复合索引作为主键。
因为复合索引作主键,查询速度会慢。
•在多表join的SQL里,保证驱动表与被驱动表的连接列上有索引。
•索引命名,主键使用pk_ ,唯一索引使用uk_,二级索引使用idx_。
mysql数据库开发规范4
•数据类型选择尽量优化,能使用int的不使用varchar,注意varchar(x)。x代表可以存放多少个字符,做到尽量少。
•涉及到金钱、小数类型使用 decimal精度类型,禁止使用 float 和 double。
•任何数值型字段,如明确不会存储负数,则使用unsigned
mysql数据库开发规范5
•插入数据库时,INSERT语句必须明确要插入的字段,即推荐使用下面的插入方式。
INSERT INTO tablename(field1,field2,......fieldn) VALUES(value1,value2,......valuesn);
示例: INSERT INTO emp(ename,hiredate,sal,deptno) VALUES('zzx1','2000-01-01','2000',1);
•字段不能为null,特别是热点查询列。可以在表模型中使用default指定默认值。
•尽可能使用批量插入、更新、删除。
mysql数据库开发规范6
•禁止update语句无where条件,或where条件没使用索引。
•禁止delete语句无where条件,或有where条件但没使用索引。
ps:where条件使用索引能大大提升更新和删除的速度
mysql数据库开发规范7
•严禁使用SELECT *方式查询语句, 必须明确查询字段,INSERT语句必须明确要插入的字段。
•严禁单条SQL关联表超过3张,多表关联查询时,关联字段必须有索引且数据类型一致,保证被关联的字段必须有索引。
•严禁单条SQL子查询超过2层
ps:上面的操作都是为了提高查询速度
mysql数据库开发规范8
•尽可能使用where条件替代having子句。
•严禁隐式转换,即传入变量类型与查询条件中字段类型不匹配。
•严禁对where条件中的字段进行条件筛选或者排序,并且避免在列上做运算或者使用函数。
where和having的区别
1、Where 子句是用来指定 "行" 的条件的,而Having 子句是指定 “组” 的条件的。即:
Where 子句 = 指定行所对应的条件
Having 子句 = 指定组所对应的条件
2、从语句的执行效率来看,Where中的条件在执行分组前进行过滤,能够减少排序的数据量;Having中的条件则是对分组后的行进行过滤。因此,当在Where子句和Having子句中都可以使用的条件,从语句的执行效率来讲,最好写在Where子句中。
3、使用Where子句更具速度优势的另一个理由是,可以对Where子句指定条件所对应的列创建索引,这样可以大幅提高处理速度;
4、Where子句中不能使用聚合函数,而Having子句中可以,如:max,min,sum,count,avg。
mysql数据库开发规范9
•严禁负向查询条件(!=、<>、not ...)等;
•like子句尽量前置匹配,前置不加%,以便能够利用索引;
•全模糊查询(例如:column_A like ‘%服务’); 用IN代替OR,IN列表严禁超过100个。
说明: “非”操作无法使用索引;“%”前缀模糊匹配无法使用索引。前置匹配“zx%”,可以使用前缀索引;IN查询需要遍历(外表条数*内表条数)次,建议用exists 代替。
不推荐写法: select * from admin where admin_name like '%de%';
推荐写法: select * from admin where admin_name like 'df%‘;
不推荐写法: select num from a where num in(select num from b);
推荐写法: select num from a where exists(select num from b where ..) ;
不推荐写法: select * from admin where firstname=‘li‘ or ‘wang‘;
推荐写法: select * from admin where firstname in(‘li‘ , ‘wang‘);
mysql数据库开发规范10
•禁止分页查询偏移量过大,如limit 10000,10;
•更新大量数据时,使用limit和order by主键进行必要的分批提交;
•删除大量数据时,使用limit和order by主键进行必要的分批提交。
大数据分页优化案例
优化 前 SQL:
select * from emailcount limit 3000000,10;
优化后 SQL :
select * from emailcount where id>3000000 limit 10;
继续优化后 SQL :
select table.* from emailcount inner join ( select id from emailcount limit 3000000,10 ) as tmp on tmp.id=table.id;