二、MySQL 物理设计

物理设计


一、定义数据库、表及字段的命名规范

数据库、表及字段的命名要遵守可读性原则表意性原则长名原则

二、选择合适的存储引擎

存储引擎 事务 锁粒度 主要应用 忌用
InnoDB 支持 支持MVCC的行级锁 事务处理
MyISAM 不支持 支持并发插入的表级锁 select、insert 读写操作频繁
MRG_MyISAM 不支持 支持并发插入的表级锁 分段归档,数据仓库 全局查找过多的场景
Archive 不支持 行级锁 日志记录,只支持insert、select 需要随机读取、更新及删除
Ndb cluster 支持 行级锁 高可用性 大部分应用

三、为表中的字段选择合适的数据类型

1.原则

当一个列可以选择多种数据类型是,应当优先考虑数字类型,其次是日期或二进制类型,最后是字符串类型。对于相同级别的数据类型,应该有效选择占用空间小的数据类型

数字类型 > 日期、二进制 > 字符串

2.整数类型

列类型 存储空间 范围(有符号) 范围(无符号)
tinyint 1 字节 -128 ~ 127 0 ~ 255
smallint 2 字节 -32 768 ~ 32 767 0 ~ 65 535
mediumint 3 字节 -8 388 608 ~ 8 388 607 0 ~ 16 777 215
int/integer 4 字节 -2 147 483 648 ~ 2 147 483 647 0 ~ 4 294 967 295
bigint 8 字节 -9 233 372 036 854 775 808 ~ 9 223 372 036 854 775 807 0 ~ 18 446 744 073 709 551 615

3.实数类型

列类型 存储空间 是否精确
float 4 字节
double 8 字节
decimal 每4个字节存9个数字,小数点占一个字节

4.VARCHER、CHAR 类型

utf8 字符集为例,存储10个字符的话列定义为VARCHAR(10)CHAR(10) 而不是 VARCHAR(30)CHAR(30)

a). VARCHAR类型的存储特点

  • varchar 用于存储变长的字符串,只占用必要的存储空间
  • 列的最大长度小于255则只占用一个额外字节用于记录字符串长度
  • 列的最大长度大于255则要占用两个额外字节用于记录字符创长度

b).VARCHAR、CHAR 类型的选择

1.VARCHAR 的长度选择

  • 使用最小的符合需求的长度:MySQL 5.7 之前修改表结构需锁表;5.7之后若原长度在255以内,且修改后长度也在255以内则不锁表,否则同样需要锁表
  • varchar(5)、varchar(200)存储 “MySQL” 字符串性能不同:MySQL优化查询时会使用固定宽度,例如创建查询临时表时,需要更多的内存

2.VARCHAR 的适用场景

  • 字符串咧的最大长度比平均长度大很多
  • 字符串列很少被更新
  • 使用了utf8等多字节字符集存储的字符串

3.CAHR 的特点

  • CHAR 类型是定长的
  • 字符串存储在CHAR类型的列中会删除末尾空格,VARCHAR不会删除
  • CHAR 类型的最大宽度为255,超过则使用VARCHAR

4.CAHR 的适用场景

  • 长度近似的值:手机号、身份证
  • 短字符串:性别
  • 经常更新的字符串:流转状态

4.日期数据

1.DATETIME 类型

  • 以 YYYY-MM-DD HH:MM:SS[.fraction] 格式存储日期时间
    datetime = YYYY-MM-DD HH:MM:SS
    datetime(6) = YYYY-MM-DD HH:MM:SS[.fraction] (存储微秒)
  • DATETIME 类型与时区无关,占用8个字节的存储空间
  • 时间范围 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59

2.TIMESTAMP 类型

  • 存储由格林尼治时间1970年1月1日到当前时间的秒数
  • 以 YYYY-MM-DD HH:MM:SS[.fraction] 的格式显示
  • 占用4个字节,实际存储为 int
  • 时间范围 1970-01-01 ~ 2038-01-19
  • 显示依赖于所指定的时区
  • 在行的数据修改时可以自动修改timestamp列的值,默认第一列timestamp可自动更新,也可通过建表语句指定:可用于记录数据修改的时间

3.DATE、TIME类型(MySQL5.7 之后)

  1. DATE类型
  • 占用自己鹅湖比使用字符串、datetime、int 存储要少,使用date类型只需要三个字节
  • 使用DATE类型还可利用日期时间函数进行日期之间的计算
  • 范围 1000-01-01 ~ 9999-12-31
  1. TIME类型
  • 用于存储时间数据,格式为 HH:MM:SS

4.注意事项

  1. 不要使用字符串类型来存储日期时间数据:a.日期时间类型通常比字符串占用的存储空间小;b.日期时间类型在进行查找过滤时可以利用日期来进行对比;c.日期时间类型还有着丰富的处理喊出,可以方便的对其进行日期计算
  2. 使用int存储日期时间不如使用timestamp类型:本身即为int存储,但是展示时更易读

四、总结

如何为InnoDB选择主键?

  • 主键应该尽可能的小:因为每一个非主键索引都会附加主键的信息,如果我们主键非常大的话,会使索引变慢,影响查询效率
  • 主键应该是顺序增长的:避免了随机IO的产生,增加数据的插入效率。如果主键不能保证顺序增长,则有可能每次插入后都有可能进行随机排序,会带来额外的IO消耗
  • InnoDB的主键和业务主键可以不同:为了保证业务主键的唯一性,可以设置唯一索引
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章