MySQL数据库规约.

一 、建表规约

一 、表达是与否概念的字段,必须使用 is_xxx 的格局命名,数据类型是
unsigned tinyint(1 表示是, 0 表示否) 。

② 、表名、字段名必须运用小写字母或数字,
禁止出现数字开始,禁止多个下划线中间只现出数字。数据库字段名的改动代价十分大,因为不能够开始展览预表露,所以字段名称须要多加商量。

叁 、表名不行使复数名词。

④ 、主键索引名为 pk_字段名; 唯一索引名为 uk_字段名; 普通索引名则为
idx_字段名。

五 、小数类型为 decimal,禁止使用 float 和 double(存在精度损失的题材)

六 、假设存款和储蓄的字符串长度大约等于,使用 char 定长字符串类型。

七 、表必备三字段: id, gmt_create, gmt_modified。

注解: 在那之中 id
必为主键,类型为 unsigned bigint、单表时自增、步长为 1。
gmt_create,gmt_modified 的门类均为 date_time 类型。

捌 、字段允许适当冗余,以增强查询质量,但必须考虑数据一致。冗余字段应依照:

1)
不是累累修改的字段。

2) 不是 varchar
超长字段,更无法是 text 字段。

正例:
商品类目名称使用效能高, 字段长度短,名称基本有序,
可在相关联的表中冗余存款和储蓄类目名称,制止关联合检查询

 

九 、单表行数超过 500 万行可能单表体积超过 2GB,才推荐举行分库分表。

二 、索引规约

一 、业务上全部唯一特点的字段,尽管是多少个字段的整合,也务必建成唯一索引。

② 、当先多个表禁止 join。要求 join 的字段,数据类型必须断然相同;
多表关联合检查询时,保证被提到的字段必要有目录。

③ 、在 varchar
字段上树立目录时,必须内定索引长度,没要求对全字段建立目录,依照实际文本区分度决定索引长度即可。

表达:
索引的长短与区分度是一对争论体,一般对字符串类型数据,长度为 20
的目录,区分度会高达 九成上述,能够采取 count(distinct left(列名,
索引长度))/count(*)的区分度来规定。

四 、页面搜索严禁左模糊只怕全模糊,如若急需请走搜索引擎来缓解。

证实: 索引文件具有
B-Tree
的最左前缀匹配特性,假若左侧的值未规定,那么不恐怕使用此索引。

五 、利用延迟关联可能子查询优化超多分页场景。

表明: MySQL 并不是跳过
offset 行,而是取 offset+N 行,然后返重播弃前 offset 行,再次来到N 行,那当
offset
尤其大的时候,作用就可怜的放下,要么控制重回的总页数,要么对超越一定阈值的页数进行SQL改写。

正例:
先神速稳定需求得到的 id 段,然后再涉及:

SELECT a.* FROM 表 1 a,
(select id from 表 1 where 条件 LIMIT 100000,20 ) b where
a.id=b.id

陆 、SQL 质量优化的靶子:至少要完成 range 级别, 须求是 ref 级别,
假如能够是 consts最好。

说明:

1) consts
单表中最四唯有多少个匹配行(主键恐怕唯一索引)
,在优化阶段即可读取到数据。

2) ref
指的是运用普通的目录(normal index) 。

3) range
对索引举办限定检索。

⑦ 、建组合索引的时候,区分度最高的在最右侧。

正例: 假如 where a=? and
b=? , a 列的差不多接近于唯一值,那么只供给单建 idx_a 索引即可

捌 、若是有 order by 的光景,请留意使用索引的有序性。 order by
最终的字段是构成索引的一有的,并且位居索引组合顺序的终极,幸免出现file_sort 的情况,影响查询性能。

正例: where a=? and b=?
order by c; 索引: a_b_c

反例:
索引中有限定查找,那么索引有序性不大概利用,如: WHERE a>10 O瑞虎DEWrangler BY b;
索引a_b 不能排序 

⑨ 、利用覆盖索引来进行查询操作,
防止回表。

注明: 假若一本书须要精通第 11
章是哪些题目,会翻动第 11 章对应的那一页吗?目录浏览一下就好,那个目录正是起到覆盖索引的功能。
正例: 能够建立目录的品种:主键索引、唯一索引、普通索引,而覆盖索引是一种查询的一种效用,用 explain 的结果, extra 列会冒出: using index。 

三、SQL语句

① 、不要接纳 count(列名)或 count(常量)来代表 count(*), count(*)是
SQL92 定义的正经总结行数的语法,跟数据库无关,跟 NULL 和非 NULL 非亲非故

贰 、count(distinct col) 总结该列除 NULL 之外的不重复行数, 注意
count(distinct col1, col2) 假使内部一列全为
NULL,那么正是另一列有分裂的值,也回到为 0。

三 、当某一列的值全是 NULL 时, count(col)的回来结果为 0,但
sum(col)的回到结果为NULL,由此使用 sum()时需注意 NPE 难点。

正例:
能够运用如下方式来制止 sum 的 NPE 难题: SELECT
IF(ISNULL(SUM(g)),0,SUM(g)) FROM table;

肆 、在代码中写分页查询逻辑时,若 count 为 0
应直接回到,制止执行前面包车型客车分页语句。

伍 、禁用存款和储蓄进度,存款和储蓄进度难以调节和测试和扩充,更未曾移植性。

网站地图xml地图