问:MySQL表过大,你有哪些优化实践?

当MySQL单表记录数过大时,数据库的CRUD(创建、读取、更新、删除)性能会明显下降。为了提升性能,我们需要采取一些优化措施。本文将详细介绍几种常见的优化方案。

1. 限定数据的范围

描述

务必禁止不带任何限制数据范围条件的查询语句。例如,在查询订单历史时,可以控制在一个月的范围内。

示例

-- 不推荐的查询
SELECT * FROM orders;

-- 推荐的查询
SELECT * FROM orders WHERE order_date >= '2023-09-01' AND order_date < '2023-10-01';

优点

  • 提高查询性能,避免全表扫描。

缺点

  • 需要在业务代码中添加范围限制逻辑。

2. 读/写分离

描述

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

架构图

读写分离示意

主库(写) -> 从库(读)

示例

通过配置数据库连接池实现读写分离,例如使用MyCat等中间件。

优点

  • 减轻主库压力,提高读写性能。

缺点

  • 数据同步延迟问题。
  • 架构复杂度增加。

3. 垂直分区

描述

根据数据库里面数据表的相关性进行拆分。例如,将用户表拆分成用户登录表和用户信息表。

示例

-- 用户登录表
CREATE TABLE user_login (
    user_id INT PRIMARY KEY,
    username VARCHAR(50),
    password VARCHAR(50)
);

-- 用户信息表
CREATE TABLE user_info (
    user_id INT PRIMARY KEY,
    email VARCHAR(100),
    phone VARCHAR(20)
);

优点

  • 列数据变小,减少I/O次数。
  • 简化表结构,易于维护。

缺点

  • 主键冗余。
  • 需要管理冗余列,引起Join操作。
  • 事务变得更加复杂。

4. 水平分区

描述

保持数据表结构不变,通过某种策略存储数据分片。每一片数据分散到不同的表或库中。

示例

将用户表按用户ID进行水平拆分。

-- 用户表1
CREATE TABLE user_1 (
    user_id INT PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(100)
);

-- 用户表2
CREATE TABLE user_2 (
    user_id INT PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(100)
);

策略

  • Range Partitioning(范围分区)
  • List Partitioning(列表分区)
  • Hash Partitioning(哈希分区)

优点

  • 支持非常大的数据量。
  • 提高查询性能。

缺点

  • 分片事务难以解决。
  • 跨节点Join性能较差。
  • 逻辑复杂。

5. 数据库分片

客户端代理

描述

分片逻辑在应用端,封装在jar包中,通过修改或封装JDBC层来实现。例如当当网的Sharding-JDBC、阿里的TDDL。

示例

使用Sharding-JDBC进行分片。

// 配置数据源和分片规则
Map<String, DataSource> dataSourceMap = new HashMap<>();
dataSourceMap.put("ds0", createDataSource("jdbc:mysql://localhost:3306/db0"));
dataSourceMap.put("ds1", createDataSource("jdbc:mysql://localhost:3306/db1"));

ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.getBindingTableGroups().add("t_order");

TableRuleConfiguration orderTableRuleConfig = new TableRuleConfiguration("t_order", "ds${0..1}");
orderTableRuleConfig.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order_${order_id % 2}"));
shardingRuleConfig.getTableRuleConfigs().add(orderTableRuleConfig);

ShardingDataSource shardingDataSource = ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, new Properties());

// 使用分片数据源
try (Connection conn = shardingDataSource.getConnection()) {
    Statement stmt = conn.createStatement();
    stmt.executeQuery("SELECT * FROM t_order");
}

中间件代理

描述

在应用和数据中间加了一个代理层,分片逻辑统一维护在中间件服务中。例如Mycat、360的Atlas、网易的DDB。

示例

配置Mycat进行分片。

<!-- mycat 配置文件 -->
<schema>
    <table name="t_order" primaryKey="order_id" dataNode="dn1,dn2" rule="sharding-by-order-id">
    </table>
</schema>

<dataNode>
    <name>dn1</name>
    <dataHost>localhost1</dataHost>
    <database>db1</database>
</dataNode>

<dataNode>
    <name>dn2</name>
    <dataHost>localhost2</dataHost>
    <database>db2</database>
</dataNode>

<rule>
    <columns>order_id</columns>
    <algorithm>sharding-by-order-id</algorithm>
</rule>

方案比较

方案描述优点缺点适用场景
限定数据范围控制查询范围,避免全表扫描提高查询性能业务代码中需添加范围限制逻辑所有查询操作
读写分离主库负责写,从库负责读减轻主库压力,提高读写性能数据同步延迟,架构复杂度增加读写操作频繁的系统
垂直分区数据表按列拆分列数据变小,减少I/O次数,简化表结构,易于维护主键冗余,需管理冗余列,引起Join操作,事务复杂表列多,部分列访问频繁
水平分区数据表按行拆分支持大数据量,提高查询性能分片事务难解决,跨节点Join性能差,逻辑复杂单表数据量巨大
客户端代理分片分片逻辑在应用端,封装在JDBC层应用端改造少,支持大数据量存储分片事务难解决,跨节点Join性能差,逻辑复杂,需额外维护分片逻辑中小型系统,客户端改造方便
中间件代理分片分片逻辑在中间件,应用与数据库之间加代理层应用端无需改造,支持大数据量存储,分片逻辑集中管理中间件性能瓶颈,架构复杂度增加,需额外维护中间件大型系统,需统一管理分片逻辑

结语

优化大表的方法多种多样,选择哪种方案取决于具体的业务需求和系统架构。在优化过程中,需要权衡各种因素,如性能、复杂度、维护成本等。希望本文的内容能帮助大家更好地理解和应用大表优化方案,提升数据库性能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新品发布:Manus Metagloves Pro虚拟现实手套

Manus 全新发布的 Metagloves Pro量子追踪手套能够支持您捕捉手部的每一个细节动作&#xff0c;您的手指捕捉将不再有任何限制。Manus Metagloves Pro可帮助您节省在制作动画时的宝贵时间&#xff0c;提供更加真实的手部动作表现。 Manus Metagloves Pro支持快速设置&#xff0…

C++从入门到起飞之——红黑树 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1. 红⿊树的概念 2. 红⿊树的实现 2.1 构建整体框架 2.2 红黑树的插入 2.3 红黑树的验证 2.4 红黑树…

解决JAVA使用@JsonProperty序列化出现字段重复问题(大写开头的字段重复序列化)

文章目录 引言I 解决方案方案1:使用JsonAutoDetect注解方案2:手动编写get方法,JsonProperty注解加到方法上。方案3:首字母改成小写的II 知识扩展:对象默认是怎样被序列化?引言 需求: JSON序列化时,使用@JsonProperty注解,将字段名序列化为首字母大写,兼容前端和第三方…

万字图文实战:从0到1构建 UniApp + Vue3 + TypeScript 移动端跨平台开源脚手架

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f343; vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f…

使用 NumPy 和 Matplotlib 实现交互式数据可视化

使用 NumPy 和 Matplotlib 实现交互式数据可视化 在数据分析中&#xff0c;交互式可视化可以更好地帮助我们探索和理解数据。虽然 Matplotlib 是静态绘图库&#xff0c;但结合一些技巧和 Matplotlib 的交互功能&#xff08;widgets、event handlers&#xff09;&#xff0c;我…

Git创建和拉取项目分支的应用以及Gitlab太占内存,如何配置降低gitlab内存占用进行优化

一、Git创建和拉取项目分支的应用 1. 关于git创建分支&#xff0c; git创建分支&#xff0c;可以通过git管理平台可视化操作创建&#xff0c;也可以通过git bash命令行下创建&#xff1a; A. 是通过git管理平台创建&#xff1a; 进入gitlab管理平台具体的目标项目中&#xff…

mac电脑设置chrome浏览器语言切换为日语英语等不生效问题

在chrome中设置了语言&#xff0c;并且已经置顶了&#xff0c;但是不生效&#xff0c;在windows上直接有设置当前语言为chrome显示语言&#xff0c;但是mac上没有。 解决办法 在系统里面有一个单独给chrome设置语言的&#xff1a; 单独给它设定成指定的语言&#xff0c;然后重…

Find My平板键盘|苹果Find My技术与键盘结合,智能防丢,全球定位

‌平板键盘的主要用途包括提高输入效率、支持轻量化办公、提供丰富的文本编辑功能以及快捷操作。相比于直接在屏幕上打字&#xff0c;使用键盘可以显著提升输入速度&#xff0c;减少输入错误&#xff0c;特别是对于需要大量文字输入的场景&#xff0c;如写作、记录笔记等‌。平…

如何在算家云搭建GPT-SOVITS(语音转换)

一、模型介绍 GPT-SOVITS是一款强大的小样本语音转换和文本转语音 WebUI工具。它集成了声音伴奏分离、自动训练集分割、中文ASR和文本标注等辅助工具。 具有以下特征&#xff1a; 零样本 TTS&#xff1a; 输入 5 秒的声音样本并体验即时文本到语音的转换。少量样本 TTS&…

【linux网络编程】| 网络基础 | 解析IP与Mac地址的区别

前言&#xff1a;本节内容讲解一些网络基础相关的知识点&#xff0c; 不涉及网络代码&#xff01;同样的本节内容是作为前一篇的补充知识点&#xff0c; 前一篇文章地址&#xff1a;【linux网络编程】 | 网络基础Ⅰ| 认识网络-CSDN博客&#xff0c;本篇文章内容较少&#xff0c…

Unreal Engine5安装Niagara UI Renderer插件

系列文章目录 文章目录 系列文章目录前言一、如何下载安装Niagara UI Renderer插件 前言 在2024.10.24号的今天发现unreal engine官网已经没有虚幻商城了&#xff0c;取而代之的是FAB ‌虚幻商城已经停止运营&#xff0c;Epic Games推出了新的数字资产商店FAB。‌ Epic Games…

重构商业生态:DApp创新玩法与盈利模式的深度剖析

随着区块链技术的发展&#xff0c;DApp&#xff08;去中心化应用&#xff09;正在从实验走向成熟。DApp以去中心化、透明性和不可篡改性为基础&#xff0c;结合智能合约&#xff0c;逐步改变传统商业运作模式&#xff0c;创造新的市场生态。本文将从DApp的独特优势、创新玩法和…

解决Docker部署ocserv的时候,遇到客户端经常重连问题

本章教程,主要介绍在Docker部署ocserv的时候,客户端连接的时候,会出现每4分钟重连问题。 解决办法 这是ocserv的核心配置文件ocserv.conf,它通常是在/etc/ocserv/目录下,主要影响每4分钟重连的参数是auth-timeout,单位是秒,原本这个默认值是240,经过单位换算,恰巧等于…

AI赋能R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面&#xff0c;成为Science、Nature论文的…

MySQL 初阶——多版本控制 MVCC

一、版本链&#xff08;undo 日志&#xff09; a. 什么是版本链 版本链就是一条以事务为节点的单链表。其 next 指针指向前一个版本的事务。 b. 版本链的增删 当一个事务被完成时&#xff0c;这个事务就会被加入到版本链里去&#xff1b;当要回滚时&#xff0c;版本链就会删…

微服务网关Zuul

一、Zuul简介 Zuul是Netflix开源的微服务网关&#xff0c;包含对请求的路由和过滤两个主要功能。 1&#xff09;路由功能&#xff1a;负责将外部请求转发到具体的微服务实例上&#xff0c;是实现外部访问统一入口的基础。 2&#xff09;过滤功能&#xff1a;负责对请求的过程…

多元线性回归【正规方程/sklearn】

多元线性回归【正规方程/sklearn】 1. 基本概念1.1 线性回归1.2 一元简单线性回归1.3 最优解1.4 多元线性回归 2. 正规方程求最优解2.1 线性回归的损失函数&#xff08;最小二乘法&#xff09;2.2 推导正规方程2.3 正规方程练习2.4 使用sklearn计算多元线性方程2.5 凸函数 3. 线…

masm 6.15下载及DOSBox自动挂载

这里写目录标题 工具参考masm下载准备自动挂载 工具 系统&#xff1a;Windows 11 应用&#xff1a;DOSBox 0.74-3 masm 6.15文件 参考 DOSBox 下载安装教程&#xff1a;本人写的《DOSBox下载安装&#xff08;Windows系统 DOSBox 0.74-3&#xff09;》 https://blog.csdn.ne…

STM32-Modbus协议(一文通)

Modbus协议原理 RT-Thread官网开源modbus RT-Thread官方提供 FreeModbus开源。 野火有移植的例程。 QT经常用 libModbus库。 Modbus是什么&#xff1f; Modbus协议&#xff0c;从字面理解它包括Mod和Bus两部分&#xff0c;首先它是一种bus&#xff0c;即总线协议&#xff0c;和…

监督学习之逻辑回归

逻辑回归&#xff08;Logistic Regression&#xff09; 逻辑回归是一种用于二分类&#xff08;binary classification&#xff09;问题的统计模型。尽管其名称中有“回归”二字&#xff0c;但逻辑回归实际上用于分类任务。它的核心思想是通过将线性回归的输出映射到一个概率值…