美文网首页mysql
一 、高性能MySQL 数据库设计规范

一 、高性能MySQL 数据库设计规范

作者: AKyS佐毅 | 来源:发表于2017-12-25 21:37 被阅读74次

1、数据库设计规范

  • 所有数据库对象名称必须使用小写字母并用下划线分割。

  • 所有数据库对象名称禁止使用MySQL保留关键字。

  • 数据库对象的命名做到见名知义,最好不要超过32个字符。

  • 临时表必须以temp为前缀并以日期为后缀。

  • 备份库,备份表必须以bak_为前缀并,以日期为后缀。

  • 所有存储相同数据的列名和列类型必须一致。


2、数据库基本设计规范

  • 所有表必须使用Innodb存储引擎。

  • 5.6以后Innodb存储引擎成为默认引擎。

  • 支持事务,行级锁,更好的恢复性,高并发下的性能更好。

  • 数据库和表的字符集统一使用UTF8,解决由于字符集转产生的乱码

  • MySQL中的UTF8字符汉字占3个字节,ASCII码占用1个字节。

  • 所有的表和字段都需要添加注释。使用commnet从句添加表和列的备注

  • 从一开始就开始数据字典的维护。

  • 尽量控制表数量的大小,建议控制在500万以内。MySQL 并不是能够存储500万数据,这种限制取决于存储设置和文件限制

  • 历史数据的归档,分库分表等手段来控制数据量的大小

  • 谨慎使用MySQL 分区表。分区表在物理上表现为多个文件,在逻辑上表现为一个表。谨慎选择分区键,跨分区查询效率可能更低。

  • 尽量做到冷热数据分离,减少表的宽度。减少磁盘IO,保证热数据的内存缓存命中率

  • 利用更加有效的缓存,避免读入无用冷数据。

  • 把经常使用的列放在一个表中。

  • 禁止在表中建立预留字段。预留字段命名很难做到见名知意。预留字段无法确认存储的数据类型,所以无法选择合适的类型。

  • 对预留字段类型的修改,会对表进行锁定。修改一个字段的成本比预留的成本要大。

  • 禁止在数据库中存储图片,文件等二进制数据

  • 禁止在线上做数据库压力测试。

3、索引设计规范

  • 限制每张表上的索引数量,建议单张表索引不超过5个。

  • 禁止给表中的每一列都建立单独的索引。

  • 每个Innodb表必须有一个主键。不使用更新频繁的列为主键,不使用多列主键。

  • 不要使用UUID,MD5,HASH,字符串列作为主键。

  • 主键建议选择使用自增长键。

  • 那系列中建立索引:

    • SELECT、 UPDATE 、DELETE语句的where从句中的列。
    • 包含ORDER BY 、GROUP BY、DISTINCT中的字段。
    • 多个表JOIN的关联列

4、如何选择索引列的顺序

  • 明确建立索引的目的。区分度最高的列放在联合索引的最左侧。

  • 在区分度不大的情况下,尽量把字段长度小的列放在联合索引的最左侧。

  • 使用最频繁的列放在联合索引的最左侧。

  • 避免建议冗余索引和重复索引。反例:(primary key(id) / index(id) / unique index(id))
    index(a,b,c) / index(a,b) /index(a)

  • 对于频繁的查询优先考虑使用覆盖索引。避免了Innodb表进行索引的二次查找,可以把随机IO变为顺序IO加速查询效率。

  • 尽量避免使用外键,不建议使用外键约束,但是在表与表之间的关联键上建立索引。

  • 外键可用于保证数据的参照完整性,但建议在业务端实现。

  • 外键会影响父表和子表的写操作从而降低性能。

5、数据库字段设计规范

  • 优先选择符合存储需要的最小的数据类型。

    • 将字符串转化为数字类型存储。INET_ATON('255.255.255.255') = 4294967295,INET_NTOA(4294967295) = '255.255.255.255' 。

    • 对于非负型的数据来说,要优先使用无符号整型来存储。 无符号相对于有符号可以多出一倍的存储空间。 SIGNED INT -2147483648~2147483647 / UNSIGNED INT 0 ~ 4294967295

    • VARCHAR(N) 中的N 表示的是字符数,而不是字节数。N = 255 ,是可以保存255个中文。使用UTF8存储汉子Varchar(255) = 765个字节。

    • 过大的长度会消耗更多的内存。

    • 避免使用TEXT、BLOB数据类型。 TinyText \ Text \ MidumText \ LongText。text类型可以存储64K的内容。TEXT 或者BLOB列分离到单独的扩展表中。TEXT 或者BLOB类型只能使用前缀索引。

  • 避免使用ENUM数据类型。

    • 修改ENUM值需要使用ALTER语句。存在一定操作风险。

    • ENUM类型的ORDER BY操作效率低,需要额外操作。

    • 禁止使用数值作为ENUM的枚举值。

  • 尽可能将所有列定义为NOT NULL。 索引NULL列需要额外的空间来保存,所以要占用更多的空间。进行比较和计算要对NULL值做特别的处理。

  • 字符串存储日期型的数据。缺点是:1:无法用日期函数进行计算和比较。 2: 用字符串存储日期要占用更多的空间。

  • 使用TIMESTAMP或者DATETIME类型存储时间。TIMESTAMP存储日期有限。

  • 对于金融,财务数据,必须使用decimal类型,精准的数据类型。decimal类型占用空间由定义的宽度决定。可用于存储比bigint更大的整数数据。


微信扫码关注java技术栈,获取Java面试题和架构师相关题目和视频。

相关文章

  • MySQL之数据类型的选择

    引用 分享一份大佬的MySQL数据库设计规范,值得收藏 MySQL 高性能表设计规范 选择原则 更小的通常更好更小...

  • 数据库规范

    Tips:高性能可扩展mysql视频学习记录(一)1.数据库的命名规范 2.数据库基础设计规范 3.索引设计规范(...

  • Mysql 规范

    Mysql 规范 数据库命名规范总结 数据库基本设计规范 索引设计规范 数据库字段设计规范 数据库SQL开发规范 ...

  • 数据库设计规范

    【MySQL】MySQL数据库设计规范 1. 规范背景与⽬的 MySQL数据库与 Oracle、 SQL Serv...

  • mysql 设计规范

    MySQL数据库设计规范目录规范背景与目的设计规范2.1 数据库设计2.1.1 库名2.1.2 表结构2.1.3 ...

  • MySQL 数据库设计规范(存档)

    MySQL 数据库设计规范 目录 1. 规范背景与目的 2. 设计规范2.1 数据库设计2.1.1 通用命名约定2...

  • 一 、高性能MySQL 数据库设计规范

    1、数据库设计规范 所有数据库对象名称必须使用小写字母并用下划线分割。 所有数据库对象名称禁止使用MySQL保留关...

  • MySQL书目

    MySQL数据库索引设计与优化 MySQL技术内幕 MySQL排错指南 高性能MySQL MySQL DBA修炼之道

  • mysql基础

    mysql添加外键的4种方式 MySQL基础考点1 MySQL基础考点2 MySQL数据库六大设计规范总结1 My...

  • MySQL数据库设计规范

    MySQL数据库设计规范 转载原文:https://github.com/jly8866/archer/blob/...

网友评论

    本文标题:一 、高性能MySQL 数据库设计规范

    本文链接:https://www.haomeiwen.com/subject/xhxrgxtx.html