• 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,差距很大。

  • 相关阅读:
    Nginx安装
    node.js搭建vue脚手架
    Oracle引入数据
    MVC引入Junit单元测试
    Git版本控制器
    IDEA-Maven
    SSM框架整合
    【测试基础第五篇】测试用例编写和评审
    【测试基础第四篇】测试用例设计方法
    【测试基础第三篇】需求测试分析
  • 原文地址:https://www.cnblogs.com/linhongwenBlog/p/13267340.html
Copyright © 2020-2023  润新知