首页 > 数据库 >MySQL数据库表结构优化方式详解

MySQL数据库表结构优化方式详解

时间:2023-06-05 13:56:59浏览次数:61  
标签:数据库 查询 详解 拆分 MySQL 分表 分区

前言

从今天开始本系列文章就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。


全文大约【2083】 字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富案例及配图视频,让你更好的理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考...

一. 数据库结构优化

数据库的库表结构优化包含很多内容,例如:字段类型优化、垂直分表、水平分表、表分区、分库等内容。 下面就带各位小伙伴一起分析下具体内容。

1. 字段类型优化

字段类型优化的目的是将字段类型设置的更合理一些,我们总结的规则如下:

  • 尽量将表字段定义为NOT NULL约束,这时由于在MySQL中含有空值的列很难进行查询优化,NULL值会使索引以及索引的统计信息变得很复杂。

  • 对于只包含特定类型的字段,可以使用enum、set 等数据类型。

  • 数值型字段的比较比字符串的比较效率高得多,字段类型尽量使用最小、最简单的数据类型。例如IP地址可以使用int类型。

  • 尽量使用TINYINT、SMALLINT、MEDIUM_INT作为整数类型而非INT,如果非负则加上UNSIGNED。但对整数类型指定宽度,比如INT(11),没有任何用,因为指定的类型标识范围已经确定。

  • VARCHAR的长度只分配真正需要的空间。

  • 尽量使用TIMESTAMP而非DATETIME,但TIMESTAMP只能表示1970 - 2038年,比DATETIME表示的范围小得多,而且TIMESTAMP的值因时区不同而不同。

  • 单表不要有太多字段,建议在20以内。

  • 合理的加入冗余字段可以提高查询速度。

2. 垂直拆分表(垂直切割)

垂直拆分按照字段进行拆分,其实就是把组成一行的多个列分开放到不同的表中,这些表具有不同的结构,拆分后的表具有更少的列。例如用户表中的一些字段可能经常访问,可以把这些字段放进一张表里。另外一些不经常使用的信息就可以放进另外一张表里。

插入的时候使用事务,也可以保证两表的数据一致。缺点也很明显,由于拆分出来的两张表存在一对一的关系,需要使用冗余字段,而且需要join操作。但是我们可以在使用的时候可以分别取两次,这样的来说既可以避免join操作,又可以提高效率。

2.1 拆分时机:

单表字段过多, 并且不需要一次性查询返回展示到一个页面上。

2.2 拆分方法:

一个页面需要展示的数据字段, 尽量放在一张表中. 如果拆分成多个表, 那么这多个表的关系是1:1:1:1......的关系。

2.3 优点 :

拆分后查询单表性能得到提升, 速度快。

2.4 缺点:

如果拆分后, 需要查询跨多张表的数据就会用到join连接查询, 查询速度会比没拆分前慢。

3. 水平拆分表(水平切割)

水平拆分按照行进行拆分,常见的就是分库分表

以用户表为例,可以取用户ID,然后对ID取10的余数,将用户均匀的分配进这 0-9这10个表中。查找的时候也按照这种规则,又快又方便。

有些表业务关联比较强,那么可以使用按时间划分的。例如每天的数据量很大,需要每天新建一张表。这种业务类型就是需要高速插入,但是对于查询的效率不太关心。表越大,插入数据所需要索引维护的时间也就越长。

3.1 拆分时机:

MySQL单表大于500万条数据, 就需要考虑水平分表, 因为单表数据量越大查询越慢, 查询效率成指数级下降。

3.2 拆分方法:

根据业务拆分:

根据时间范围拆分, 例如: 订单数据, 按照订单创建时间, 一个月一张表。

按照区间分为拆分, 例如: 按照表自增id, 1-300万条一张表。

按照业务分类拆分, 例如: 用户表按照男女拆分。

hash分表:

通过一个原始目标的ID或者名称通过一定的hash算法计算出数据存储表的表名,然后访问相应的表。普通hash算法和一致性hash算法均可。

一般企业利用工具来做水平分表:

服务端分库分表: MyCat, corbar等。

客户端分库分表: shardingJDBC, ShardingSphere等。

3.3 优点:

提高了查询效率, 主要是在大量数据情况, 提高了查询的命中率。

3.4 缺点:

提高了复杂度. 在数据量不大的情况, 水平分表体现不出好处。

4. 表分区

4.1 目的

表分区给大家简明扼要的说就是大量数据操作, 会有磁盘IO跟不上的情况, 所以表分区, 就是将保存在硬盘上的数据文件放到一块或者多块硬盘上, 以提高数据库的IO性能。

分区适用于例如日志记录,查询少。一般用于后台的数据报表分析。对于这些数据汇总需求,需要很多日志表去做数据聚合,我们能够容忍1s到2s的延迟,只要数据准确能够满足需求就可以。

MySQL主要支持4种模式的分区:Range分区、List预定义列表分区,Hash 分区,Key键值分区。

4.2 录入使用key键值分区

举个栗子:
请添加图片描述


二. 结语

最后在这里对本文核心要点进行总结:

  1. 各位小伙伴需要熟练记住垂直分表和水平分表的方案以及优缺点,在合适的时机进行灵活使用。
  2. 垂直分表一定要慎用,用不好会造成表结构变得复杂化不利于查询。

以上就是本文的全部内容,关于MySQL数据库相关知识点,欢迎和我们一起交流讨论~

配套视频资料戳这里

标签:数据库,查询,详解,拆分,MySQL,分表,分区
From: https://www.cnblogs.com/qian-fen/p/17457583.html

相关文章

  • 20项女生心理测试性格测试ACCESS数据库
    今天这个数据库是女生专项心理测试数据库,数据库包含4个表:Subject(测试项目表)、Question(项目下测试题目)、Answer(题目下选项及得分)、Explain(项目累计得分解析表),具体看以下截图:包含:你是一个乐观的女生吗?你是一个自信的女生吗?你是一个可爱的女生吗?你是一个意志坚强的女生吗?你是一......
  • 126个专业心理测试系统ACCESS数据库
    今天这份数据库是从一个心理测试软件破解出来的一系列的心理自量表,人格自量表以及精神病自量表等量化心理测试表,适用于医院、学校、职场等机构进行心里咨询,并且可以进行诊断测试。【续后:原150个测试项目经过第二次整理检查去除无效数据仅有126个测试项目,实际记录数会和上面截......
  • 1500个心理测试大全题库ACCESS数据库
    今天收集到了一个结构很简单的心理测试题库,所谓的结构很简单是区别于《常用心理测试精选题库ACCESS数据库》、《心理测试性格测试大全ACCESS数据库》等数据库一个测试项目需做几道题然后给出解释,表与表需要关联而言的,这个心理测试很简单,给出一个测试题目,你回答ABCD即给出解释。......
  • Mysql 主从备份 Last_Errno: 1146 Last_Error: Error executing row event: 错误问题
    本人在做主从备份的时候发现了此问题! 1主数据库是已经把这个表删除了丛数据库也是没有备份这个表但是一直报这个错原因是bin-log日志有这个表 但是没记录到已经把这个表删除了 主从表同步实际从库是根据主库的bin-log二进制的SQL进行执行的 这是Mysql的一个BUG1......
  • 大模型核心技术原理: Transformer架构详解
    在大模型发展历程中,有两个比较重要点:第一,Transformer架构。它是模型的底座,但Transformer不等于大模型,但大模型的架构可以基于Transformer;第二,GPT。严格意义上讲,GPT可能不算是一个模型,更像是一种预训练范式,它本身模型架构是基于Transformer,但GPT引入了“预测下一个词”的任......
  • 【HarmonyOS】详解低代码端云一体化开发之连接器
    ​【关键字】元服务、低代码平台、端云一体化开发、连接器、拖拽式UI 【1、写在前面】前面我们写了两篇文章分别介绍了低代码平台的基本使用和端云一体化开发中数据模型的使用,有需要的可以了解一下,文章地址贴在下面了:低代码平台的基本使用:https://developer.huawei.com/co......
  • mysql 8.0 解压版安装以及安装版更改密码
    解压版:下载地址https://dev.mysql.com/downloads/mysql/在根目录下创建文本文档,并重命名为my.ini文件 使用文本编辑器打卡my.ini,将下面内容复制进去[mysqld]#validate_password密码校验#plugin-load-add=validate_password.dll#connection_control登录超时插件#p......
  • 排序算法中的冒泡和选择排序详解(持续更新系列)
    本系列文章为Java基础入门内容,致力于为大家详细讲解学习Java中的一些难点、常见点等,内容由浅入深。文末有全文重点总结及配套视频资料,更多相关技术问题欢迎和我们一起交流讨论!更多学习资料可点这里获取前言我们要想成为一个优秀的程序员,其实非常关键的一点就是要锻炼培养自己的......
  • 云原生第六周--k8s组件详解(下)
    一Velero结合minio实现kubernetesetcd数据备份与恢复Velero简介:Velero是vmware开源的一个云原生的灾难恢复和迁移工具,它本身也是开源的,采用Go语言编写,可以安全的备份、恢复和迁移Kubernetes集群资源数据Velero支持标准的K8S集群,既可以是私有云平台也可以是公有云,除了灾备......
  • 常用心理测试精选题库ACCESS数据库
    心理测试类的数据库结构有很多种,比如已经发过的《心理测试性格测试大全ACCESS数据库》、《心理测试性格测试简装版ACCESS数据库》就是两种不同的结构。而今天发的《常用心理测试精选题库ACCESS数据库》却又是另一种结构:1.测试主表(即测试项目)(类别ID关联类别表,有爱情测试、性格测......