MySQL数据库规约

黄金时代、建表规约

1、表达是与否概念的字段,必需选拔 is_xxx 的措施命名,数据类型是
unsigned tinyint(1 代表是, 0 表示否卡塔 尔(阿拉伯语:قطر‎ 。

2、表名、字段名必得使用小写字母或数字,
制止现身数字最初,幸免八个下划线中间只现出数字。数据库字段名的校正代价十分大,因为不能够进展预表露,所以字段名称须要严慎思量。

3、表名不采纳复数名词。

4、主键索引名称为 pk_字段名; 独一索引名字为 uk_字段名; 普通索引名则为
idx_字段名。

5、小数类型为 decimal,禁绝选用 float 和 double(存在精度损失的标题)

6、假诺存款和储蓄的字符串长度大概也正是,使用 char 定长字符串类型。

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

证实: 此中 id
必为主键,类型为 unsigned bigint、单表时自增、步长为 1。
gmt_create,gmt_modified 的花色均为 date_time 类型。

8、字段允许适当冗余,以拉长查询质量,但必得考虑数据生龙活虎致。冗余字段应依据:

1卡塔尔国不是几度改过的字段。

2卡塔 尔(阿拉伯语:قطر‎ 不是 varchar
超长字段,更无法是 text 字段。

必赢365net手机版,正例:
商品类目名称使用效用高, 字段长度短,名称基本不改变,
可在相关联的表中冗余存款和储蓄类目名称,防止关联合检查询

 

9、单表行数超越 500 万行或然单表容积超过 2GB,才推荐进行分库分表。

二、索引规约

1、业务上独具唯意气风发特点的字段,即便是多个字段的三结合,也亟须建设成唯一索引。

2、超过多少个表幸免 join。须要 join 的字段,数据类型必须断然雷同;
多表关联合检查询时,保障被波及的字段须求有目录。

3、在 varchar
字段上确立目录时,必得钦点索引长度,没须求对全字段创设目录,依照实际文本区分度决定索引长度就可以。

表达:
索引的长短与区分度是生机勃勃对冲突体,通常对字符串类型数据,长度为 20
的目录,区分度会高达 九成之上,能够行使 count(distinct left(列名,
索引长度))/count(*)的区分度来明确。

4、页面找寻严禁左模糊也许全模糊,借使要求请走寻觅引擎来消除。

证实: 索引文件具备B-Tree
的最左前缀相称天性,假如侧边包车型大巴值未规定,那么不能运用此索引。

5、利用延迟关联或然子查询优化相当多分页场景。

表达: 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

6、SQL 质量优化的对象:起码要高达 range 等级, 须求是 ref 等第,
就算能够是 consts最佳。

说明:

1卡塔尔国 consts
单表中最八唯有四个相配行(主键或然独一索引卡塔尔,在优化阶段就可以读取到数据。

2卡塔尔 ref
指的是选拔普通的目录(normal index卡塔尔国 。

3卡塔尔国 range
对索引举行节制检索。

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

正例: 假若 where a=? and
b=? , a 列的差十分的少临近于唯豆蔻年华值,那么只需求单建 idx_a 索引就能够

8、假诺有 order by 的场景,请留意利用索引的有序性。 order by
最终的字段是组成索引的生机勃勃部分,何况位居索引组合顺序的尾声,幸免出现file_sort 的景况,影响查询质量。

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

反例:
索引中有约束查找,那么索引有序性无法接受,如: WHERE a>10 O奔驰M级DECR-V BY b;
索引a_b 不可能排序 

9、利用覆盖索引来进行询问操作,
幸免回表。

证实: 假设一本书须要领悟第 11
章是怎样标题,会翻动第 11 章对应的那风度翩翩页吗?目录浏览一下就好,那个目录就是起到覆盖索引的功效。
正例: 能够创设目录的连串:主键索引、独一索引、普通索引,而覆盖索引是风流倜傥种查询的生机勃勃种作用,用 explain 的结果, extra 列会情不自禁: using index。 

三、SQL语句

1、不要选择 count(列名)或 count(常量)来替代 count(*), count(*)是
SQL92 定义的标准总结行数的语法,跟数据库非亲非故,跟 NULL 和非 NULL 毫无干系

2、count(distinct col) 总括该列除 NULL 之外的不另行行数, 注意
count(distinct col1, col2) 假若中间一列全为
NULL,那么就算另一列有不相同的值,也回到为 0。

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

正例:
可以运用如下方式来防止 sum 的 NPE 难点: SELECT
IF(ISNULL(SUM(g)),0,SUM(g)) FROM table;

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

5、禁绝行使存款和储蓄进程,存款和储蓄进度难以调节和测验和扩大,更从未移植性。

Leave a Comment.