作者简介:小明java问道之路,专心于研讨 Java/Liunx内核/C++及汇编/核算机底层原理/MySQL/中间件源码,就职于大型金融公司后端高级工程师,擅长交易范畴的高安全/可用/并发/功用的架构规划与演进、体系优化与稳定性建造。

热心共享,喜爱原创~ 重视我会给你带来一些不一样的认知和生长

InfoQ签约作者、CSDN专家博主/后端范畴优质创作者/内容合伙人、阿里云专家/签约博主、51CTO专家

假如此文还不错的话,还请重视 、点赞 、收藏三连支撑一下博主~


本文导读

本篇文章结合前面上一篇文章 MySQL建表与常见类型规划圈套,结合上文所学的特点类型,本文具体介绍表结构的字段类型挑选和表的物理存储规划,主要有库、表、字段、索引的命名标准,反范式的规划准则、表紧缩。

一、库、表、字段、索引命名规划标准

命名标准如下,命名时的字符取值范围为:az、AZ和下划线。,一切表名小写并且不允许驼峰式命名,不允许运用其他特别字符作为称号,削减潜在风险。

数据库库名和表名的命名都应该遵循见名知意的准则。

表名的命名规矩仅运用 a~z、下划线,分表称号为表名_编号,事务表有必要包含事务含义

这样包含了更多的事务信息,比方:订单体系库ORDER、产品体系库GOODS、活动营销体系库PROMO等等。订单表order_info、分摊明细表fork_business_detail、支付流水表order_pay_log等等。

字段名准确,遵循见名知意的准则,格局:称号_后缀。例如用户名的字段为 UserName 而不是 Name ,布尔型的字段,以 is 开头,例如是否经过查看 ischecked
常见后缀如下:流水号或许无意义主键,后缀为 id,比方 order_id,时间后缀为 time,insert_time。

索引命名格局,主要为了区分哪些目标是索引,前缀_表名或缩写)字段名,主键有必要运用前缀“pk”,UNIQUE 约束有必要运用前缀“uk_”,一般索引有必要运用前缀“idx_”。

创立表时显现指定字符集、存储引擎、注释信息等。不同体系之间,应该由DBA一致标准;

不同表之间的相同字段或许相关字段,字段类型/命名要保持一致;库表字符集和前端程序、中间件有必要保持一致的 UTF8mb4。

数据库标准库表字段的命名,能够进步数据库的易读性。

二、反范式表结构规划实战

1、什么是数据库规划范式?

1.1数据库规划的榜首范式

数据库表中的一切字段都只具有单一特点,单一特点的列是由基本数据类型所构成的,规划出来的表都是简略的二维表:
例如name-age列具有两个特点,一个name,一个age不符合榜首范式,应该把它拆分红两列

【MySQL】高性能高可用表设计实战-表设计篇(MySQL专栏启动)

【MySQL】高性能高可用表设计实战-表设计篇(MySQL专栏启动)修改

1.2 数据库规划的第二范式

要求表中只具有一个事务主键,也便是说符合第二范式的表不能存在非主键列只对部分主键的依赖关系。

【MySQL】高性能高可用表设计实战-表设计篇(MySQL专栏启动)

【MySQL】高性能高可用表设计实战-表设计篇(MySQL专栏启动)修改

一个订单有多个产品,所以订单的主键为【订单ID】和【产品ID】组成的联合主键,这样2个组件不符合第二范式,而且产品ID和订单ID没有强相关,故,把订单表进行拆分为订单表与订单与产品的中间表。

【MySQL】高性能高可用表设计实战-表设计篇(MySQL专栏启动)

【MySQL】高性能高可用表设计实战-表设计篇(MySQL专栏启动)修改

1.3 数据库规划的第三范式

指每一个非非主特点既不部分依赖于也不传递依赖于事务主键,也便是在第二范式的基础上相处了非主键对主键的传递依赖

其间。客户编号和订单编号办理相关,客户名字和订单编号办理相关,客户编号和客户名字相关,假如客户编号产生改动,用户名字也会改动,这样不符合第三大范式,应该把客户名字这一列删去。

【MySQL】高性能高可用表设计实战-表设计篇(MySQL专栏启动)

【MySQL】高性能高可用表设计实战-表设计篇(MySQL专栏启动)修改

2、忘掉范式准则,反范式规划实战

真实的事务场景是工程完结,表结构规划做好以下三点就现已足够:

1、每张表必定要有一个主键、有创立时间、创立人、更新时间更新人;

2、恰当冗余数据、对杂乱目标运用JSON大字段存储,一份数据在一张表只保留一份,能够恰当冗余需要相关查询的不变的数据;

3、对分库分表(分布式数据库)不是用自增ID做主键,事务表应该运用 UUID 或事务(具有事务唯一性)自定义主键;

三、企业表紧缩实战

当事务发展到必定规模,表规划的再优异也会产生功用问题,一旦产生便是严重性的。对于没有分库分表的表,在物理存储层面主要是考虑是否要运用紧缩(页)表功用,默认情况下,一切表都对错紧缩的。

1、什么是紧缩表

数据库表空间中的页存储在磁盘上,MySQL数据库有必要首先将磁盘中的页读取到内存缓冲池,然后读取和办理页中的记载。因而,页中存储的记载越多,数据库的功用就越高。

在MySQL中,页的默认巨细为16K,页构成每个表的表空间。页中存储的记载越多,内存中能够存储的记载就越多,拜访功率就越高。

假如要增加页中的记载数,能够启用紧缩功用。此外,启用紧缩后,存储空间更小,同一存储单元能够存储更多数据。

启用紧缩技能,能够依据每个数据、数据库表和页空间紧缩数据库。

然而在实践项目中,咱们一般运用页紧缩技能。为什么?

紧缩每条记载,每次读取或写入记载时,都会对其进行紧缩宽和紧缩。假如过分依赖CPU的核算才能,功用将显著下降,而且单个记载的巨细不是特别大,一般小于1K,所以紧缩功率不是特别好;紧缩表空间要求表空间文件不会静态增长。

经过页紧缩技能,MySQL能够将16K页紧缩到8K,乃至4K,这样当从磁盘写入或读取时,I/O请求巨细能够折半,乃至更小,以进步数据库的整体功用。

2、TPC紧缩实战

咱们一般运用,TPC紧缩,TPC(Transparent Page Compression 通明页紧缩)是5.7版中引进的一种新的页紧缩功用。紧缩16K页后,将为8K。

然后数据库将为16K页的剩余8K填充0x00。当16K页写入磁盘时,基于TPC紧缩的测验成果将在未紧缩的基础上额定进步40%的功用。

能够运用以下指令创立TPC紧缩表,假如是创立表的时候没有紧缩,经过 ALTER TABLE “表名” 启用 TPC 紧缩后,还需要执行指令 OPTIMIZE TABLE 才能立即完结空间的紧缩。

CREATE TABLE order_info (
  // 
)
COMPRESSION=ZLIB | LZ4 | NONE;

【MySQL】高性能高可用表设计实战-表设计篇(MySQL专栏启动)

总结

本篇文章结合前面上一篇文章 MySQL建表与常见类型规划圈套,结合上文所学的特点类型,本文具体介绍表结构的字段类型挑选和表的物理存储规划,主要有库、表、字段、索引的命名标准,反范式的规划准则、表紧缩。

后续博主会对建表的索引规划进行具体介绍。

本文正在参加「技能专题19期 漫谈数据库技能」活动