【MySQL进阶之路 | 高级篇】优化数据库结构和大表优化

目录结构:

目录

目录结构:

1. 优化数据库结构

1.1 拆分表:冷热数据分离

1.2 增加冗余字段

1.3 优化数据类型

情况1:对整数类型数据进行优化

情况2:既可以使用文本类型也可以使用整数类型的字段,要选择使用整数类型

1.4 优化查询记录的速度

A. MyISAM引擎的表

1. 禁用索引

2. 禁用唯一性检查

B. InnoDb引擎的表

1. 禁用唯一性检查

2. 禁用外键

3, 禁止自动提交

1.5 使用非空约束

1.6 分析表,检查表和优化表


1. 优化数据库结构

一个好的数据库设计方案对于数据库的性能能常常会起到事半功倍的效果。合理的数据库结构不仅仅使数据库占用更小的磁盘空间,而且能使查询速度更快。数据库结构的设计需要考虑数据冗余,查询和更新的速度,字段的数据类型是否合理等多方面的内容。

1.1 拆分表:冷热数据分离

拆分表的思路是,把一个包含很多字段的表拆分为两个或多个相对较小的表。这样做的目的是,这些表中某些字段的操作频率很高(热数据),经常要进行查询或更多操作,而另外一些字段的使用频率却很低(冷数据)。冷热数据分离,可以减少表的宽度。如果放在一个表里,每次查询都要读取大的记录,会消耗较多的资源。

MySQL限制每个表最多存储4096列,并且每一行数据的大小不能超过65535字节。表越宽,把表载进内存缓冲池所占用的内存也就越大,也会消耗更多的IO。冷热数据分离的目的就是:减少磁盘IO;保证热数据的内存缓存命中率。更有效利用缓存,避免读入无用的冷数据。

1.2 增加冗余字段

设计数据表时应尽量遵守范式理论的制约,尽可能减少冗余字段,让数据库设计看起来精致,优雅。但是,合理加入冗余字段可以提高查询速度。

表的规范化程度越高,表与表之间的关系也越多,需要连接查询的情况也越多,尤其在数据量大的情况下,而且需要频繁进行连接的时候,为了提高效率,我们也可以考虑增加冗余字段来减少连接。

1.3 优化数据类型

改进表的设计时,可以考虑优化字段的数据类型。优先选择符合存储要求的最小数据类型。

列的字段越大,建立索引时的所需的空间也就越大,这样一页中所能存储的索引节点的数量也就越少,在遍历时需要的IO次数也就越多,索引的性能也就越差。

具体来说:

情况1:对整数类型数据进行优化

遇到整数类型的字段可以用INT类型。这样做的理由是,INT型的数据有足够大的取值范围,不用担心数据超出范围的问题。对于非负型的数据(比如自增ID,整形IP)来说,要优先使用无符号整型UNSIGNED来存储。因为无符号相对于有符号,同样的字节数,存储的数值更大。

情况2:既可以使用文本类型也可以使用整数类型的字段,要选择使用整数类型

根文本类型数据相比,大整数往往占用更少的存储空间。因此,在存取和比对的时候,可以占用更少的内存空间。所以,在二者皆可用的前提下,尽量使用整数类型,这样可以提高查询效率。

1.4 优化查询记录的速度

插入记录时,影响插入速度的主要是索引,唯一性校验,一次插入记录条数等。根据这些情况可以分别进行优化。这里我们分为MyISAM和InnoDB存储引擎来讲。

A. MyISAM引擎的表

1. 禁用索引

对于非空表,插入记录时,MySQL会根据表的索引对插入的记录建立索引,如果插入大量数据,建立索引就会降低插入记录的速度。为了解决这样情况,可以在插入记录之前禁用索引,数据插入完毕后再开启索引。禁用索引的语句如下:

alter table table_name DISABLE KEYS;

重新开启索引的语句如下:

alter table table_name ENABLE KEYS;

若对于空表批量导入数据,则不需要进行该操作,因为iMyISAM引擎的表是导入数据以后才建立索引的。

2. 禁用唯一性检查

插入数据时,MySQL会对插入的记录进行唯一性检验。这种唯一性校验会降低插入记录的速度。为了降低这种情况对查询速度的影响,可以在插入记录之前禁用唯一性检查,等到记录插入完毕后再开启,禁用唯一性检查的语句如下:

SET UNIQUE_CHECKS=0;

B. InnoDB引擎的表

1. 禁用唯一性检查

插入数据之前执行SET UNIQUE_CHECKS=0;来禁止读唯一性索引的检查,数据导入完毕后再运行开启唯一性检查。这个和上述使用方法一样。

2. 禁用外键

插入数据之前执行禁止对外键的检查,数据插入完毕后再恢复对外键的检查。

3, 禁止自动提交

插入数据之前禁止事务自动提交,数据导入完成后,恢复自动提交。语句如下

set autocommit=0;

1.5 使用非空约束

在设计字段的时候,如果业务允许,建议尽量使用非空约束。这样的好处是:

  1. 在进行比较和计算时,省去要对NULL值字段判断是否为空的开销,提高存储效率。
  2. 非空字段也容易创建索引。因为i索引NULL列需要额外的空间来保存,所以需要占用更多的空间。使用非空约束,就可以节省存储空间。

1.6 分析表,检查表和优化表

MySQL提供了分析表,检查表和优化表的语句。分析表主要是分析关键字的分布,检查表主要是检查表的错误,优化表主要是消除删除或者更新造成的空间浪费。

2. 大表优化

当MySQL单表记录过大时,数据库的CURD性能会明显下降,一些常见的优化措施如下:

2.1 限定查询的范围

禁止不带任何限制数据范围条件的查询语句。

2.2 读/写分离

经典的数据库拆分方案,主库负责写,从库负责读。

1. 一主一从模式:

66071f92a44e42308073cf9c5b5015b2.png

2. 双主双从模式:

2.3 垂直拆分

当数据量达到千万级以上时,有时候我们需要把一个数据库切成多份,放到不同的数据库服务器上,减少对单一服务器的访问压力。

  • 如果数据库中的数据表过多,可以采用垂直分库的方式,将关联的数据表部署在同一个数据库上。
  • 如果数据表中的列过多,可以采用垂直分表的方式,将一张数据表拆成多张表,把经常一起使用的列放到一张表里。

垂直拆分的优点:可以使得列数据变小,在查询的时候减少读取的Block数,减少IO次数。此外,垂直分区可以简化表结构,易于维护。

垂直拆分的缺点:主键会出现冗余,需要管理冗余列,并引起JOIN关联表的操作。此外,垂直拆分也会让事务变得更加复杂。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/875063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IPython中的LaTeX魔法:%%latex 指南

IPython中的LaTeX魔法:%%latex 指南 在数据科学和科学计算领域,IPython因其强大的交互式特性而广受欢迎。IPython提供了一个名为Jupyter Notebook的环境,它允许用户在网页浏览器中以网页应用的形式编写和运行代码。而LaTeX,作为一…

vue3【详解】组合式函数

什么是组合式函数? 利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数,用于实现逻辑复用,类似 react18 中的 hook 函数名称 – 以 use 开头,采用驼峰命名,如 useTitle参数 – 建议使用 toValue() 处理(…

LeetCode热题100刷题17:124. 二叉树中的最大路径和、437. 路径总和 III、199. 二叉树的右视图

124. 二叉树中的最大路径和 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nul…

主页目录导航

Java核心 JVM专题一:深入分析Java工作机制 JVM专题二:Java如何进行编译的 JVM专题三:Java代码如何运行 JVM专题四:JVM的类加载机制 JVM专题五:类加载器与双亲委派机制 JVM专题六:JVM的内存模型 JVM专…

llama3.1数据集处理方法

一、预训练数据 截止到23年底。 1.网页数据清洗 1.个人身份信息和安全性过滤:设计过滤器,会删除根据多种Meta安全标准被评定为有害的域名,以及已知包含成人内容的域名。 2.文本提取和清洗:处理未截断的网页文档的原始HTML内容&…

Github 2024-07-17 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-17统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量非开发语言项目3Python项目3Rust项目2TypeScript项目2MDX项目1项目化学习 创建周期:2538 天协议类型:MIT LicenseStar数量:161973 个Fork数量…

基于51单片机的指纹红外密码电子锁

基于51单片机的指纹红外密码电子锁 1、系统功能介绍2、演示视频3、系统框图4、系统电路介绍4.1、STC89C52单片机最小系统设计4.2、LCD12864显示屏电路设计4.3、矩阵键盘按键控制部分电路设计4.4、AS608指纹模块电路设计 5、程序设计5.1、LCD12864屏幕初始化5.2、AT24C02存储芯片…

打造直播工具详解:从零开始开发直播美颜SDK

今天,笔者将详细讲解如何从零开始开发一个直播美颜SDK,帮助开发者了解开发过程中的关键环节和技术要点。 一、需求分析与规划 在开发之前,首先需要明确美颜SDK的功能需求。一般来说,美颜SDK应包含以下几个核心: 基础…

【TAROT学习日记】韦特体系塔罗牌学习(7)——恋人 THE LOVERS VI

韦特体系塔罗牌学习(7)——恋人 THE LOVERS VI 目录 韦特体系塔罗牌学习(7)——恋人 THE LOVERS VI牌面分析1. 基础信息2. 图片元素 正位牌意1. 关键词/句2.爱情婚姻3. 学业事业4. 人际财富5. 其他象征意 逆位牌意1. 关键词/句2. …

uniapp在手机端预览文件

handlePdf(url) {uni.showLoading({title: 加载中,mask: true,})wx.downloadFile({url: url,success: function(res) {console.log(res)uni.hideLoading()var filePath res.tempFilePathuni.showLoading({title: 正在打开,mask: true,})wx.openDocument({filePath: filePath,f…

从零开始的CPP(23)动态规划解决最长回文串

leetcode5 给你一个字符串 s,找到 s 中最长的 回文串 示例 1: 输入:s "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。 最开始我是将回文串都存入map。使用substr进行切割…

css快捷代码【超出一行文本显示省略号/超出三行显示省略号/超出n行...】

常见的css小tips:显示省略号,文本超出容器显示省略号…没啥好说的,直接拷贝代码吧 .containers {overflow:hidden;text-overflow:ellipsis;text-align:justify;word-break:break-all;display:-webkit-box;-webkit-box-orient:vertical;-webk…

MS17-010漏洞复现+利用

1、 漏洞简述 漏洞名称:“永恒之蓝”漏洞 漏洞编号:MS17-010,CVE-2017-0143/0144/0145/0146/0147/0148 漏洞类型:缓冲区溢出漏洞 漏洞影响:信息泄露 CVSS评分:9.3(High) 利用难…

食家巷擀面皮:一口惊艳的传统美味

在美食的世界里,总有一些经典让人难以忘怀,食家巷擀面皮便是其中之一。食家巷擀面皮,那一张张薄而有劲道的面皮,宛如艺术品般细腻。它的外观晶莹剔透,散发着诱人的光泽,让人看一眼就忍不住想要品尝。制作擀…

Vue使用FullCalendar实现日历/周历/月历

Vue使用FullCalendar实现日历/周历/月历 需求背景:项目上遇到新需求,要求实现工单以日/周/月历形式展示。而且要求不同工单根据状态显示不同颜色,一个工单内部,需要以不同颜色显示三个阶段。 效果图 日历 周历 月历 安装插件…

MySQL学习——影响选项文件处理的命令行选项

大多数支持选项文件的MySQL程序都处理以下选项。因为这些选项会影响选项文件处理,所以必须在命令行上给出,而不是在选项文件中给出。为了正常工作,这些选项中的每一个都必须在其他选项之前给出,但以下情况除外: 打印默…

力扣第二十五题——K个一组反转链表

内容介绍 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内…

自定义IPython启动:打造个性化的交互式编程环境

自定义IPython启动:打造个性化的交互式编程环境 IPython,一个强大的交互式Python解释器,提供了丰富的定制选项,允许用户根据个人或团队的需求定制其行为和外观。设置自定义的启动命令是IPython定制功能的一部分,它可以…

1万6千多传统文化之古代地名大全ACCESS\EXCEL数据库

继续采集传统文化数据,之前采集过《传统文化之非物质文化大全ACCESS数据库》、《名人大全古今人物ACCESS数据库》、《传统文化之民俗文化大全ACCESS数据库》,今天的是古代地名查询: 截图下方有显示“共有记录数”,截图包含了表的所…

探索WebKit的CSS盒模型:深入理解Web布局的基石

探索WebKit的CSS盒模型:深入理解Web布局的基石 在Web开发的世界中,CSS盒模型(Box Model)是构建网页布局的核心原理。WebKit,作为Safari浏览器的渲染引擎,对CSS盒模型有着深入而精确的支持。本文将带你深入…