SA工作-mysql设计规范

表的设计

字段尽量设置not null,mysql的null值和空字符串不一样,null值占用空间,空字符串不占用空间。Null值占用空间,比较时会参与比较,但b树索引不会存储null值,因此当索引的字段包含null值,效率会下降。
一般没有业务因素影响,采用数值型的自增长列作为主键。
Mysql的字段设计需要集约化,越小的占用存储空间越好,能数值不字符,能日期不字符。
注意Mysql的varchar类型要计算好长度,因为mysql在表被查询后会把表信息缓存到内存中,在内存中申请是按照最大长度申请。
将不常用的字段或大字段从主表拆分出来放到子表,通过主键关联访问;对于核心访问频度极高的表,需要反范式设计,增加冗余字段,减少与其它表的join操作。

 

索引的设计

主键字段尽量短,数值型是较好的选择。Mysql innodb单列索引默认情况下限制长度767,使用utf8字符集,长度限制为255。
当查询包含的条件和字段很少时,可以创建覆盖索引。这样数据可以全部在索引中获得,将不再回表。
当需要在长文本字段上创建索引时,可以考虑增加一个虚拟hash列,采用crc32计算一个hash值,针对这个列创建索引。只用这个索引做等值查询,索引的空间占会小很多。
组合索引在多列上创建,单列索引在一个列上创建。

查询使用索引的条件不同一般组合索引需要按照“最左前缀”来执行查询,并不是每个列都需要覆盖,只是从左边的列开始组合。
  例如有索引key(a,b,c)
  where a=xx and b=xx and c=xxx 此语句可以用到索引
  where b=xx and a=xx and c=xxx 同上,顺序没有关系,同样能用到索引
  where a=xx and b=xx 可以用到索引
  where a=xx and c=xx 可以用到索引
  where b=xx and c=xx 用不到索引 where b=xx 用不到索引 where c=xx 用不到索引

 

Innodb只支持索引组织表,为了提高系统的性能,增加查询速度,所以要建立索引.

好处:   1) 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性

    2) 大大加快数据的检索速度

    3) 可以加速表和表之间的连接,特别是在实现数据的参考完整性方

    4) 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间

开发管理项目中的索引应用,使用到普通索引、唯一索引、主键索引、组合索引.

例如:

1)sp_issue.product产品字段,时常做为查询条件:设置字段不为NULL,且增加索引

ALTER TABLE sp_issue MODIFY product VARCHAR(100) NOT NULL;

ALTER TABLE sp_issue ADD INDEX INX_PRODUCT (PRODUCT);

2)人员权限表sp_user_priv无主键,留着普通索引,建联合主键.

alter table sp_user_priv add constraint pk_sp_user_priv primary key (user_code,priv_type,priv_value);

 

序号

常用Oracle数据类型
对应MySQL数据类型

 

 

 

Oracle

MySQL

1

TIMESTAMP(6)

DATETIME(6)或timestamp(6)

2

NUMBER

int or bigint

3

CHAR

char

4

CLOB

text or varchar

5

DATE

datetime

6

RAW

char

7

VARCHAR2 

vharchar

8

BLOB

blob

 

数值型字段尽量不用字符类型存储

原因:UTF-8 下:mysql下 VARCHAR(20)  ;表明字段可以存放20个字符,若中文则是占用60个byte(1中文=3BYTE),若英文或者数字则为占用20个byte。

INT 大小为4 字节(定义), 存储的数值范围是 (0,4 294 967 295), 即只要存储的数值是这个范围内,永远都是占用4个BYTE。

假设 存放 1000这样一个值, 如果存放到数据类型VARCHAR中, 那么就是 1000个byte,就是1kb大小

而存放到 int中,就只是占用4个byte,即只有0.004KB,差距很大。

 

字段不设置为NULL

当字段时常做为查询条件时,设置改字段不为NULL,可以设置默认值来填充方式.

原因:1)MySQL的NULL不等于空字符串;WEB开发的时候,如果有的地方插入记录是指定空字符串,有的地方插入记录没有指定值,查询=’’的时候就会过滤掉为(NULL)的数据

  2)索引不会包含有NULL值的列 只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL

例如:设置sp_issue.product 不为NULL

ALTER TABLE sp_issue MODIFY product VARCHAR(100) NOT NULL;

 

2.1 数值型字段尽量不用字符类型存储

原因:UTF-8 下:mysqlVARCHAR(20)  ;表明字段可以存放20个字符,若中文则是占用60byte1中文=3BYTE),若英文或者数字则为占用20byte

INT 大小为4 字节(定义), 存储的数值范围是 (04 294 967 295), 即只要存储的数值是这个范围内,永远都是占用4BYTE

假设 存放 1000这样一个值, 如果存放到数据类型VARCHAR中, 那么就是 1000byte,就是1kb大小

而存放到 int中,就只是占用4byte,即只有0.004KB,差距很大。

posted @ 2020-07-08 15:48  林被熊烟岛  阅读(232)  评论(0编辑  收藏  举报