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

这篇具有很好参考价值的文章主要介绍了【MySQL】高性能高可用表设计实战-表设计篇(MySQL专栏启动)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

mysql表空间设计,《MySQL从入门到精通与实战》,mysql,数据库,命名规范,范式,压缩表

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C++及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。

 

📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。

 

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

 

🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~ 

本文目录

本文目录

本文导读

一、库、表、字段、索引命名设计规范

二、反范式表结构设计实战

1、什么是数据库设计范式?

1.1 数据库设计的第一范式

1.2 数据库设计的第二范式

1.3 数据库设计的第三范式

2、忘记范式准则,反范式设计实战

三、企业表压缩实战

1、什么是压缩表

2、TPC压缩实战

总结


本文导读

本篇文章结合前面上一篇文章 MySQL建表与常见类型设计陷阱,结合上文所学的属性类型,本文详细介绍表结构的字段类型选择和表的物理存储设计,主要有库、表、字段、索引的命名规范,反范式的设计原则、表压缩。

一、库、表、字段、索引命名设计规范

命名规范如下,命名时的字符取值范围为:a~z、A~Z和下划线。 ,所有表名小写并且不允许驼峰式命名,不允许使用其他特殊字符作为名称,减少潜在风险。

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

表名的命名规则仅使用 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,数据库,命名规范,范式,压缩表

1.2 数据库设计的第二范式

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

mysql表空间设计,《MySQL从入门到精通与实战》,mysql,数据库,命名规范,范式,压缩表

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

mysql表空间设计,《MySQL从入门到精通与实战》,mysql,数据库,命名规范,范式,压缩表

1.3 数据库设计的第三范式

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

其中。客户编号 和订单编号管理 关联,客户姓名 和订单编号管理 关联,客户编号 和 客户姓名 关联,如果客户编号发生改变,用户姓名也会改变,这样不符合第三大范式,应该把客户姓名这一列删除。

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建表与常见类型设计陷阱,结合上文所学的属性类型,本文详细介绍表结构的字段类型选择和表的物理存储设计,主要有库、表、字段、索引的命名规范,反范式的设计原则、表压缩。

后续博主会对建表的索引设计进行详细介绍。文章来源地址https://www.toymoban.com/news/detail-672177.html

到了这里,关于【MySQL】高性能高可用表设计实战-表设计篇(MySQL专栏启动)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Lvs+KeepAlived高可用高性能负载均衡

    目录 1.环境介绍 2.配置keepalived  3.测试 1.测试负载均衡 2.测试RS高可用 3.测试LVS高可用 3.1测试lvs主服务宕机 3.2.测试lvs主服务器恢复 4.我在实验中遇到的错误 环境:centos7 RS1---RIP1:192.168.163.145            VIP 192.168.163.200 RS2---RIP2:192.168.163.146            VIP 192.168.163.200 LVS_MAST

    2024年02月10日
    浏览(38)
  • 构建三高架构:高性能、高可用、高可扩展

    在当今计算机科学领域,构建强大、高效的系统已成为迫切需求。为了应对用户需求的不断增加,三高架构应运而生,包括高性能、高可用性和高可扩展性。本文将深入探讨这三个关键特性,并提供基于 Java 的代码示例来说明这些概念的实际应用。 1.1 优化的系统设计 在构建

    2024年01月25日
    浏览(44)
  • keepalived+haproxy 搭建高可用高负载高性能rabbitmq集群

    一、环境准备 1. 我这里准备了三台centos7 虚拟机 主机名 主机地址 软件 node-01 192.168.157.133 rabbitmq、erlang、haproxy、keepalived node-02 192.168.157.134 rabbitmq、erlang、haproxy、keepalived node-03 192.168.157.135 rabbitmq、erlang 2. 关闭三台机器的防火墙 3. 三台主机的host和hostname配置 4. erlang与rabbitmq版

    2024年02月11日
    浏览(41)
  • 基于k8s的高性能高可用的web集群

    模拟公司里的k8s生产环境,部署web,MySQL,nfs,harbor,Prometheus,Jenkins等应用,构建一个高性能高可用的web集群 CentOS7,k8s,docker,Prometheus,nfs,jumpserver,harbor,ansible,Jenkins等 k8s-master:192.168.121.101 k8s-node1:192.168.121.102 k8s-node2:192.168.121.103 nfs:192.168.121.104 harbor:192.168.121

    2024年04月28日
    浏览(29)
  • Redis 分区:构建高性能、高可用的大规模数据存储解决方案

    在 Redis 中,分区是一种将数据分布在多个实例上的技术,用于处理大规模数据和提高系统性能。通过分区,可以将数据均匀地分布在多个节点上,从而减轻单个节点的负载压力,并实现水平扩展。 Redis 分区应用场景 1. 大规模数据存储 在 Redis 中,单个实例的内存有限,无法

    2024年04月14日
    浏览(37)
  • 分布式微服务项目实现高并发高可用高性能可以使用到的方案

    实力有限,只能就我知道的写。总篇只写大致方案。 不同于单机环境,分布式微服务环境下最大的问题就是会出现不仅是跨线程还会有跨服务的数据一致性问题。单机环境下我们有volatile和synchronized以及JUC下的并发编程工具等工具实现并发编程。分布式跨服务环境下就得使用

    2024年02月14日
    浏览(43)
  • 《高性能MySQL》——创建高性能的索引(笔记)

    索引(在MySQL中也叫做“键(key)”) 是存储引擎用于快速找到记录的一种数据结构。 索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。 在数据量较小且负载较低时,不恰当的索引对性能的影响可能还不明显,但当数据量逐渐增大时

    2024年02月07日
    浏览(93)
  • 构建高可用、高并发和高性能的微服务系统(Spring Cloud实现)

    目前Java都在流行一个说词:高并发。 反正不管是不是,反正就是高并发。 谈高并发,我们需要知道几个名词: -响应时间(Response Time,RT) -吞吐量(Throughput) -每秒查询率QPS(Query Per Second) -每秒事务处理量TPS(Transaction Per Second) -同时在线用户数量 整体来说高并发的技术很多,但是

    2024年02月13日
    浏览(37)
  • 基于 k8s+docker 环境构建一个高可用、高性能的 web 集群。

    目录 项目架构图 项目描述 项目环境 环境准备 IP地址规划 关闭selinux和firewall 配置静态ip地址 修改主机名 升级系统(可做可不做) 添加hosts解析 项目步骤 一.使用ProcessOn设计了整个集群的架构,规划好服务器的IP地址,使用kubeadm安装k8s单master的集群环境(1个master+2个node节点

    2024年02月07日
    浏览(46)
  • 《高性能MYSQL》-- 查询性能优化

    查询性能优化 深刻地理解MySQL如何真正地执行查询,并明白高效和低效的原因何在 查询的生命周期(不完整):从客户端到服务器,然后服务器上进行语法解析,生成执行计划,执行,并给客户端返回结果。 一条查询,如果查询得很慢,原因大概率是访问的数据太多 对于低

    2024年03月11日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包