MySQL 表分区原理详解

MySQL中的表分区是一种将表的数据按照某种规则划分成多个更小、更易于管理的部分的技术。表分区可以使得查询、维护和优化大表变得更加高效。每个分区都可以看作是独立的表,但对用户来说仍然是单一的表的透明访问。

分区原理

  1. 透明性: 对于应用程序来说,分区表看起来像一个普通的未分区表。SQL语句不需要修改就能在分区表上执行。

  2. 物理存储: 物理上,每个分区实际上可能被存储在不同的文件或目录中,这取决于分区类型和配置。这意味着数据可以分散存储,以便于并行处理和优化I/O性能。

  3. 逻辑分割: 逻辑上,表数据根据某些列的值被分割到不同的分区里。MySQL支持的分区类型包括范围分区(RANGE)、列表分区(LIST)、哈希分区(HASH)和键分区(KEY)。

分区类型

  • 范围分区 (RANGE): 数据被根据指定列的值的范围分配到不同的分区。例如,你可以基于日期范围将数据归入不同的分区。

  • 列表分区 (LIST): 和范围分区类似,但是基于列的离散值进行分区。你可以指定一个列的具体值列表,并且为表中属于该列表中的每一个值指定一个分区。

  • 哈希分区 (HASH): 使用用户定义的哈希函数将数据分散到一定数量的分区中。根据列值计算得到的哈希值将决定记录存储在哪个分区。

  • 键分区 (KEY): 类似于哈希分区,但键分区仅使用MySQL服务器内置的哈希函数,并且通常是基于列的整数值进行分区。

设置分区举例

分区是在创建表或修改表结构时定义的。以下是一个创建带有范围分区的表的例子:

CREATE TABLE sales (id INT NOT NULL,sale_date DATE NOT NULL
)
PARTITION BY RANGE (YEAR(sale_date)) (PARTITION p0 VALUES LESS THAN (1991),PARTITION p1 VALUES LESS THAN (1992),...
);

在这个示例中,sales 表基于 sale_date 列的年份进行了范围分区。每个分区包含一个年份范围内的数据。

分区的优点

  • 性能提升: 对于大量数据的查询操作,如果查询条件与分区键相符合,MySQL可以只扫描相关分区,避免全表扫描。

  • 维护简便: 对于数据量很大的表,分区可以方便数据的维护工作,例如清除旧数据时只需删除整个分区即可。

  • 备份和恢复: 单个分区的备份和恢复速度比整张表快很多。

  • 高并发: 分区表可以在物理级别上提供更好的并发支持,因为不同分区的读写操作可以在不同的硬件资源上并行进行。

分区限制

虽然分区增加了表的灵活性,但也有一些限制:

  • 分区表的所有分区必须使用相同的存储引擎。
  • 有关联键(如外键)的限制。
  • 分区列必须是表的主键的一部分,如果表有主键或唯一索引。
  • 在某些情况下,查询优化器可能无法有效地利用分区来优化查询。

mysql分区注意事项和问题

1、第一次访问分区表

        当MySQL第一次打开一个分区表时,它需要加载所有分区的元数据。这意味着如果一个表有很多分区,那么初始化加载所有这些分区的开销可能会比较大。

2、Metadata Lock (MDL)

        MySQL在操作表结构(如DDL语句)前需要获得MDL锁。对于分区表来说,无论多少个分区,它们都被视为一个整体,因此共享同一个MDL锁。这样做可以防止对表结构的并发修改,但也意味着在执行类似ALTER TABLE等DDL操作时,即使只影响到部分分区,也需要等待获取整张表的MDL锁。

3、存储引擎层

        虽然在server层,分区表被视为一个单一的逻辑表,但在存储引擎层,每个分区实际上被看作是一个独立的表。因此,当已经持有MDL锁并且执行DML操作(如SELECT, INSERT, UPDATE, DELETE)时,MySQL存储引擎会根据查询的条件判断需要访问哪些分区,并且只访问必要的分区。这种行为称为“分区修剪”(partition pruning),它可以显著提高查询性能,因为它避免了对无关分区的不必要扫描。

        例如,如果一个表按月份分区且你查询特定月份的数据,优化器会识别出只需访问包含那个月份数据的分区。

4、"必要"的确定

        在查询过程中,确定哪些分区是“必要”的,取决于查询条件和分区键之间的关系。优化器会分析查询条件和分区定义,以决定是否可以排除某些分区,从而减少检索和计算的数据量。

5、DDL操作耗时问题
  • 对于大型分区表,DDL操作如ALTER TABLE往往会涉及庞大的数据量,并且需要更新所有相关分区。这可能会导致长时间的锁表,进而影响系统的可用性。
  • 为了减少此类操作的影响,可以考虑在系统负载较低的时段进行,或者使用在线DDL特性(如果存储引擎支持)。
6、分区数量问题
  • 每个分区都是一个独立的结构,在存储、管理和元数据跟踪方面都有开销。当分区过多时,这些开销会累加,可能影响性能。
  • 分区过多还可能导致复制延迟,尤其是在主从复制场景中。主服务器上的DDL操作需要在从服务器上重放,如果存在大量分区,从服务器可能会花费更长的时间去应用这些变更。
  • MySQL也有关于分区数量的硬性限制,所以必须在设计时考虑分区的合理数量。
7、分区规则和预先设置问题
  • 分区策略通常需要根据数据访问模式和业务需求来设计。一旦分区表创建后,修改分区键或分区策略都是比较困难的,尤其是在数据量非常大的情况下。
  • 如果未来需要调整分区,可能需要进行数据迁移或重建整个表,这会涉及到复杂的操作,并对业务造成影响。
  • 因此,在实施分区之前,需要仔细规划并考虑到数据增长和变动的情况。

mysql中分区表对索引的影响

  1. 键的选择:MySQL 要求分区表的所有唯一索引(包括主键)必须包含分区键。这意味着如果你的表通过某个列或列组合进行分区,这个列或列组合必须是每个唯一索引的一部分。

  2. 全局和局部索引:在 MySQL 中,默认情况下,当你为分区表创建一个索引时,它会在每个分区上都创建相同的索引结构。尽管看起来像是全局索引覆盖了整个表,实际上每个分区都有自己独立的索引副本。所以,在物理存储层面,这些索引是局部的。但是在逻辑层面,因为查询可以不需要指定分区即可使用索引,所以它们看起来像是全局索引。

  3. 索引维护:由于每个分区都有其索引的副本,当执行插入、更新或删除等写操作时,只有相关分区的索引被更新。这有助于提高大型表的性能,但也意味着当数据跨分区移动时,多个分区的索引可能需要更新。

  4. 索引扫描:分区提供了额外的优化——分区裁剪(Partition Pruning)。当查询条件包含分区键时,MySQL 可以排除那些不包含相关数据的分区,从而避免扫描所有分区的索引和数据。这可以显著提高查询性能。

  5. 前缀索引:若分区键是字符串类型并且使用前缀作为分区键,则相应的索引也必须使用相同长度的前缀。

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

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

相关文章

Java集合类的重要性

当谈到Java编程语言的强大功能时,集合类是一个不可忽视的关键组成部分。Java集合类为开发人员提供了一组丰富的数据结构和算法,用于有效地组织和操作数据。在本篇博客中,我们将深入探讨Java集合类的重要性、常见类型以及如何使用它们来提高代…

Mac 安装 Django 并连接 MySQL

一、下载安装运行Django看官方教程就好了,网址:Django 安装_w3cschool 二、连接MySQL(我用的是pymysql和mysqlclient): 1、创建好项目后找到这个文件 2、修改当中的连接信息,将这些信息改成你自己的就好了…

2023-12-01 AIGC-自动生成ppt的AI工具

摘要: 2023-12-01 AIGC-自动生成ppt-记录 自动生成ppt: BoardMix boardmix 一键生成ppt boardmix是一款基于云的ai设计软件,允许创建用于各种目的的自定义演示文稿、ai绘画,ai生成思维导图等。以下是它的一些功能: 可定制的模板 - 它有一个…

Redis基本命令

文章目录 第1关:字符串、列表与集合第2关:哈希与有序集合第3关:Redis基本事务与其他命令 第1关:字符串、列表与集合 编程要求 根据提示,在右侧Begin-End区域补充代码,完成任务分配的后端处理逻辑&#xff…

Python-docx 深入word源码 自定义页码页脚以动态显示总页数和当前页数

代码和效果图 先上能够正常显示页码页脚的Python代码和效果图,之后再解释原理和思路 from docx import Document from docx.shared import Pt from docx.oxml import OxmlElement from docx.enum.text import WD_PARAGRAPH_ALIGNMENT from docx.oxml.ns import qn…

CSIT883系统分析与项目管理——Lecture5重点概念

文章目录 一、前言二、重点概念三、题目分析总结一、前言 这次课程给大家介绍识别用户故事(user stories)和用例(use cases)与项目进度管理相关的知识与题目,这节课也可以说抛砖引玉吧,后面很多重点内容都需要理解这个概念才可以展开学习。同时这节课还有一个重点内容—…

Elasticsearch:什么是非结构化数据?

非结构化数据定义 非结构化数据是指未按照设计的模型或结构组织的数据。 非结构化数据通常被归类为定性数据,可以是人类或机器生成的。 非结构化数据是最丰富的可用数据类型,经过分析后,可用于指导业务决策并在许多其他用例中实现业务目标。…

深入理解 Vue 组件:构建优雅的前端应用

🍂引言: Vue.js 是一款流行的 JavaScript 框架,以其简单易用和高度灵活的特性而受到了广泛的欢迎。其中的一个重要概念就是组件,它使我们能够将用户界面划分为可重用的、独立的部分。本文将深入探讨 Vue 组件的概念、使用和最佳实…

java原子类型

AtomicBoolean AtomicInteger AtomicLong AtomicReference<V> StringBuilder - 不是原子类型。StringBuilder 是 java.lang 包下的类 用法&#xff1a;无需回调改变数值

【学习记录】从0开始的Linux学习之旅——应用开发(helloworld)

一、概述 Linux操作系统通常是基于Linux内核&#xff0c;并结合GNU项目中的工具和应用程序而成。Linux操作系统支持多用户、多任务和多线程&#xff0c;具有强大的网络功能和良好的兼容性。本文主要讲述如何在linux系统上进行应用开发。 二、概念及原理 应用程序通过系统调用与…

今日现货黄金最新建议

近期现货黄金价格再度逼近历史高位&#xff0c;很多本来在场外观望的投资者&#xff0c;都纷纷希望进场一试身手。然而大涨大跌的行情并不是很适合新手投资者参与&#xff0c;如果大家还没做好技术上的准备&#xff0c;可以多听听正规交易平台的专业人士的意见。 在正式入市之前…

【LeetCode每日一题合集】2023.11.20-2023.11.26 (二叉树中的伪回文路径)

文章目录 53. 最大子数组和解法1——DP解法2——分治&#xff08;维护区间、类似线段树的思想&#xff09; 2216. 美化数组的最少删除数&#xff08;贪心&#xff09;2304. 网格中的最小路径代价1410. HTML 实体解析器&#xff08;模拟&#xff09;2824. 统计和小于目标的下标对…

jsp前端输入中文数据传到controller变成问号?的解决办法

还是写老师布置的实验的时候&#xff0c;解决了xml文件找不到的问题之后又遇到新的问题&#xff1a;前端登录处输入用户名和密码&#xff0c;结果明明输入的用户名是对的密码也是对的&#xff08;输入的用户名是中文&#xff09;&#xff0c;它就是显示用户名或密码错误。然后我…

mac 系统 vmware 安装centos8

选择镜像 安装系统 依次设置有告警的项目 设置用户名密码 设置root密码 重启系统 重启成功进入下面界面 勾选&#xff0c;点击done 点击箭头所指按钮 输入密码登录 安装成功了 设置网络 打开终端 切换root用户 输入下面指令 su root 输入root的密码 安装git

ESP网络开发实例-通过WebSocket控制步进电机

通过WebSocket控制步进电机 文章目录 通过WebSocket控制步进电机1、应用程序介绍2、软件准备3、硬件准备4、代码实现4.1 Web页面创建4.2 ESP32代码实现在这个 ESP32 网络服务器应用中,我们将介绍如何构建一个 ESP32 步进电机 WebSocket 网络服务器来控制步进电机的旋转。 这将…

【Cisco Packet Tracer】交换机 学习/更新/泛洪/VLAN实验

交换机的功能是连接计算机、服务器、网络打印机、网络摄像头、IP电话等终端设备&#xff0c;并实现与其它交换机、无线接入点、路由器、网络防火墙等网络设备的互联&#xff0c;从而构建局域网络&#xff0c;实现所有设备之间的通信。 本文使用Cisco Packet Tracer仿真软件&…

DynamicDataSource

DynamicDataSource 多数据源&#xff0c;读写分离&#xff0c;主从数据库

算法题--排椅子(贪心)

题目链接 code #include<bits/stdc.h> using namespace std;struct node{int indx;//用来存储数组下标int cnt;//用来计数 };bool cmp(node a,node b){ //判断是否是数字最大的一个就是经过最多谈话人的道return a.cnt>b.cnt; } node row[2010],cow[2010];bool cmp…

润和软件HopeStage与深信服终端安全管理系统完成产品兼容性互认证

近日&#xff0c;江苏润和软件股份有限公司&#xff08;以下简称“润和软件”&#xff09;HopeStage 操作系统与深信服科技股份有限公司&#xff08;以下简称“深信服”&#xff09;终端安全管理系统完成产品兼容性测试。 测试结果表明&#xff0c;企业级通用操作系统HopeStage…

Elasticsearch 优化查询中获取字段内容的方式,性能提升5倍!

1、背景 集群配置为&#xff1a;8 个 node 节点&#xff0c;16 核 32G&#xff0c;索引 4 分片 1 副本。应用程序的查询逻辑是按经纬度排序后找前 200 条文档。 1、应用对查询要求比较高&#xff0c;search 没有慢查询的状态。 2、集群压测性能不能上去&#xff0c;cpu 使用未打…