MySQL分区表(14/16)

news2024/11/25 13:36:22

分区表

基本概述

分区表是数据库中一种用于优化大型表数据管理和查询性能的技术。它将一个表的数据根据特定的规则或条件分割成多个部分,每个部分称为一个分区。每个分区可以独立于其他分区进行存储、管理和查询,这样可以提高数据处理的效率,尤其是在处理大量数据时。

以下是分区表的一些关键特点和优势:

  1. 数据分散存储:分区表将数据分散存储在不同的物理区域,这有助于减少单个数据文件的大小,提高I/O性能。
  2. 查询优化:通过只查询相关的分区而不是整个表,可以减少数据扫描的范围,从而加快查询速度。分区表对于业务来说是透明的,不需要修改业务代码即可实现数据的分区管理。
  3. 维护便捷:分区表允许对单个分区进行备份、恢复、优化和删除等操作,而不需要影响整个表,这简化了数据库的维护工作。
分区表可以方便地清理历史数据,例如通过`ALTER TABLE ... DROP PARTITION`快速删除过期数据。
  1. 提高可用性:在某些情况下,如果一个分区出现问题,其他分区仍然可以继续工作,这提高了整个表的可用性。

  2. 灵活的分区策略:可以根据业务需求和数据特性选择不同的分区方法,如范围分区、列表分区、哈希分区等。

在实际应用中,分区表通常用于处理以下场景:

  • 数据量巨大,单个表的大小超过了数据库管理系统的推荐限制。
  • 数据访问模式具有明显的分区特征,如时间序列数据、地理位置数据等。
  • 需要定期清理或归档旧数据,同时保持新数据的高效访问。

分区表的设计和实施需要仔细规划,以确保分区策略与应用程序的需求和数据访问模式相匹配。但分区也可能引入一些复杂性,特别是在跨分区查询和数据一致性方面。

MyISAM引擎

对于MyISAM存储引擎,每个分区的数据和索引都存储在单独的文件中。这种设计允许对每个分区进行独立的管理,例如备份、恢复、优化和删除。

当为MyISAM表创建分区时,每个分区都会生成三个文件:.frm(表结构定义文件)、.MYD(MyISAM数据文件)和.MYI(MyISAM索引文件)。这些文件的命名通常遵循以下模式:

table_name-partition_number.frm
table_name-partition_number.MYD
table_name-partition_number.MYI

其中table_name是表的名称,partition_number是分区的编号或名称。

例如,如果有一个名为sales的MyISAM分区表,它包含两个分区,那么文件系统上可能会出现以下文件:

sales-0.frm
sales-0.MYD
sales-0.MYI
sales-1.frm
sales-1.MYD
sales-1.MYI

每个分区的.MYD.MYI文件包含该分区的数据和索引,而.frm文件包含整个表的结构定义,不论分区数量如何,通常只有一个.frm文件。

这种每个分区对应一组文件的方式,使得MyISAM分区表在管理大量数据时更加灵活和高效。然而,这也意味着与InnoDB等其他存储引擎相比,MyISAM分区表在文件系统层面的管理可能更为复杂。

InnoDB引擎

InnoDB存储引擎提供了几种不同的分区存储策略,以满足不同场景下的性能和维护需求。以下是InnoDB支持的主要分区存储策略及其操作步骤:

  1. 通用分区(Generic Partitioning)

    • 描述:在这种策略下,每个分区的数据和索引都存储在同一个.ibd文件中。这是MySQL默认分区方式。
    • 操作步骤
      • 创建分区表时,不需要指定单独的文件存储每个分区,InnoDB会自动管理所有分区的数据和索引。
      • 使用CREATE TABLE ... PARTITION BY语句定义分区表结构。
  2. 文件分区(File-per-Table Partitioning)

    • 描述:每个InnoDB表(包括分区表中的每个分区)都有自己的.ibd文件。这种策略在MySQL 5.7及以后的版本中引入,称为innodb_file_per_table
    • 操作步骤
      • 确保my.cnfmy.ini配置文件中启用了innodb_file_per_table选项。
      • 创建表或分区表时,每个表或分区都会自动创建一个新的.ibd文件。
      • 使用CREATE TABLE ... PARTITION BY语句定义分区表结构。
  3. 本地分区(Local Partitioning)

    • 描述:从MySQL 5.7.9版本开始,InnoDB引入了本地分区策略,允许将每个分区的数据和索引存储在单独的.ibd文件中,但这些文件都位于同一个数据库目录下。
    • 注意:本地分区策略要求所有分区的.ibd文件都存储在数据库的默认目录下,而文件分区特性则允许每个表(包括分区表中的每个分区)的.ibd文件存储在任意指定的目录下。本地分区主要是为了更好地管理分区表,而文件分区特性则提供了更广泛的表级文件管理能力。
    • 操作步骤
      • my.cnfmy.ini配置文件中设置innodb_local_partition选项为ON
      • 创建分区表时,使用DATA DIRECTORYINDEX DIRECTORY选项为每个分区指定存储路径。
  • 使用CREATE TABLE ... PARTITION BY语句定义分区表结构,并为每个分区指定DATA DIRECTORYINDEX DIRECTORY
  1. 合并分区(Merged Partitioning)

    • 描述:这是一种特殊的分区策略,它允许将多个分区合并为一个单一的分区。这在某些情况下可以提高查询性能,因为合并分区可以减少分区开销。
    • 操作步骤
      • 使用ALTER TABLE ... COALESCE PARTITION语句将两个或多个相邻分区合并为一个分区。
      • 确保合并的分区在逻辑上是连续的,并且它们具有相同的分区表达式。
  2. 系统分区(System Partitioning)

    • 描述:系统分区是一种自动管理的分区策略,它允许InnoDB自动创建和管理分区。这种策略主要用于内部系统表的分区。
    • 操作步骤
      • 对于系统表,MySQL会自动使用系统分区策略。
      • 普通用户不需要(也不能)直接操作系统分区。

在选择分区策略时,应根据数据的访问模式、存储需求、维护便利性以及性能目标来决定。例如,如果你需要对每个分区进行独立的备份或恢复,那么文件分区可能是一个好选择。如果你希望提高查询性能并减少管理开销,那么合并分区可能更适合。对于大多数用户来说,通用分区和文件分区是最常用的两种策略。

分区使用建议

InnoDB存储的文件分区、本地分区表一般包含一个.frm文件和多个.ibd文件,每个分区对应一个.ibd文件。

  • .frm文件:这是MySQL中的表定义文件(Form File),它包含了表的结构定义信息,例如表的列定义、索引、存储引擎等元数据。.frm文件是文本文件,可以直接用文本编辑器查看和编辑(虽然不推荐这样做,因为可能会破坏表的结构)。在分区表中,.frm文件通常只包含表的定义信息,而不包含实际的数据。

  • .ibd文件:这是InnoDB存储引擎的数据文件(InnoDB Data File),它包含了实际的数据和索引信息。对于分区表,每个分区的数据和索引可以存储在不同的.ibd文件中。这样做的好处是,可以单独对每个分区进行操作,比如备份、恢复、导入和导出,而不需要影响整个表。

对于InnoDB引擎层来说,这是多个表;而对于Server层来说,这仍然是一个表。这意味着,对于需要修改整个表的DDL操作,如ALTER TABLE,可能会受到MDL锁的影响,导致性能问题。

在分区时需要注意:因为MySQL访问分区表时的行为,当分区数量很多时,可能会因为打开文件的个数超过上限而报错。

作者与版本更新计划

感谢您的阅读与支持!本文是《MySQL实战与优化》专栏中的一篇精选文章,该专栏共包含16篇文章,旨在为您提供实战中可直接应用的宝贵知识。

关注公众号【数舟】,获取作者最新动态,公众号后台回复【mysql2024】,即可免费领取这份包含16篇文章的完整的PDF专栏!

目前版本为v1.0,更新时间2024年4月10日。后续此文档更新与版本发布会同步到知识星球【数舟】中。

知识整理与创作不易,感谢大家理解与支持!

加入知识星球,您将获得更多独家内容、专栏更新以及与行业内专家和同行的互动交流机会。我们在知识星球等您,一起探索MySQL的深层次世界!

星球内目前包含300+精品文章,内容涵盖大数据、MySQL、运维、Python、调优、经验分享、数据分析等方向内容,会根据大家的学习需求更新更多方向的内容。

🔗 立即扫描下方二维码,加入知识星球,与行业精英共同成长,开启您的专属学习之旅!

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

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

相关文章

代码随想录第38天| 509. 斐波那契数 70. 爬楼梯

理论基础 刷题大纲: 动态规划5步曲: 1、确定dp数组以及下标的含义 2、确定递推公式 3、dp数组如何初始化 4、确定遍历顺序 5、举例推导dp数组 509. 斐波那契数 509. 斐波那契数 - 力扣(LeetCode) 代码随想录 (programmercarl.co…

羊大师春季运动受伤应急妙招

春季运动时受伤是很常见的情况,特别是在户外活动中。了解一些应急妙招,可以帮助你在受伤时进行初步处理,减轻伤害。以下是几种常见运动伤害的应急处理方法: 扭伤和拉伤 休息:立刻停止运动,避免对受伤部位…

安达发|APS软件系统助力高端装备制造业高质量发展

APS(Advanced Planning and Scheduling,高级计划与排程系统)软件系统在高端装备制造业中的应用,对于推动行业高质量发展具有重要作用。以下是对这一主题的详细探讨: 高端装备制造业指那些技术含量高、附加值大、市场竞…

Windows 关闭占用指定端口的进程

以下示例以443端口为例,具体哪个端口视自己情况而定 输入命令 # 输出的最后一列就是进程号pid netstat -ano | findstr "443" 找出占用443端口的进程号(pid)(第二列是你本机的应用占用的端口,看第二列就行)如下图&am…

二叉查找树、二叉搜索树、二叉排序树算法分析及实现

一、几个概念 二叉树(Binary Tree),是 n(n > 0)个结点(每个结点最多只有2棵子树)的有限集合,该集合或为空集,称为空二叉树,或由一个根节点和两颗互不相交…

算法练习第16天|101. 对称二叉树

101. 对称二叉树 力扣链接https://leetcode.cn/problems/symmetric-tree/description/ 题目描述: 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2&#x…

稀碎从零算法笔记Day46-LeetCode:互质树

这几天有点懈怠了 题型:树、DFS、BSF、数学 链接:1766. 互质树 - 力扣(LeetCode) 来源:LeetCode 题目描述 给你一个 n 个节点的树(也就是一个无环连通无向图),节点编号从 0 到 …

力扣207.课程表

你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。 例如…

2024-3-29 群讨论:如何看到一个线程的所有 JFR 事件

以下来自本人拉的一个关于 Java 技术的讨论群。关注公众号:hashcon,私信拉你 如何查看一个线程所有相关的 JFR 事件 一般接口响应慢,通过日志可以知道是哪个线程,但是如何查看这个线程的所有相关的 JFR 事件呢?JMC 有…

77、WAF攻防——权限控制代码免杀异或运算变量覆盖混淆加密传参

文章目录 WAF规则webshell免杀变异 WAF规则 函数匹配 工具指纹 webshell免杀变异 php 传参带入 eval可以用assert来替换,assert也可以将字符串当作php代码执行漏洞 php 变量覆盖 php 加密 使用加密算法对php后门进行加密 php 异或运算 简化:无字符webshellP 无数字字母rc…

WPS二次开发系列:Gradle版本、AGP插件与Java版本的对应关系

背景 最近有体验SDK的同学反馈接入SDK出现报错,最终定位到原因为接入的宿主app项目的gradle版本过低导致,SDK兼容支持了android11的特性,需要对应的gradle插件为支持android11的版本。 现象 解决方案 将gradle版本升级至支持android11的插件版…

【数据结构与算法】之8道顺序表与链表典型编程题心决!

个人主页:秋风起,再归来~ 数据结构与算法 个人格言:悟已往之不谏,知来者犹可追 克心守己,律己则安! 目录 1、顺序表 1.1 合并两个有序数组 1.2 原地移除数组中所有的元素va…

Python+selenium搭建Web自动化测试框架

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 在程序员的世界中,一切重复性的工作,都应该通过程序自动执行。「自动化测…

Uniapp+基于百度智能云完成AI视觉功能(附前端思路)

本博客使用uniapp百度智能云图像大模型中的AI视觉API(本文以物体检测为例)完成了一个简单的图像识别页面,调用百度智能云API可以实现快速训练模型并且部署的效果。 uniapp百度智能云AI视觉页面实现 先上效果图实现过程百度智能云Easy DL训练图…

Proxmox VE qm 方式一键创建Windows虚拟机

前言 实现qm 方式一键创建Windows虚拟机,提高效率。 qm 一键创建Windows虚拟机 以下实现在线下载镜像,创建虚拟机,安装系统需要自己手动安装哦,如果想实现全自动安装系统,建议部署自己的内网pxe server 系统参考各参…

蓝桥杯——松散子序列

题目 分析 很明显的动态规划问题,每次我们都取当前位置的最大值就可,从头开始,dp[i]max(dp[i-2],dp[i-3])num[i-3]. 代码 ninput() num[] for i in n:num.append(ord(i)-96) dp[0]*(len(num)3) for i in range(3,len(num)3):dp[i]max(dp[i…

基于特征的多模态生物信号信息检索与自相似矩阵:专注于自动分割

论文地址:Biosensors | Free Full-Text | Feature-Based Information Retrieval of Multimodal Biosignals with a Self-Similarity Matrix: Focus on Automatic Segmentation (mdpi.com) 论文源码:无 期刊:biosensors 这篇论文提出了一种基…

java数据结构与算法刷题-----LeetCode172. 阶乘后的零

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 数学:阶乘的10因子个数数学优化:思路转变为求5的倍数…

JQuery ajax请求

实现卡号绑定功能 通过 jQuery ajax 请求用户列表数据。 API 接口地址 卡号列表 js/cardnolist.json 接口响应示例 补全 index.js 中空缺代码,实现用户输入完卡号与密码后,与 ajax 请求到的卡号数据进行比对,当卡号和密码匹配成功时&a…

使用 Docker 部署 Linux-Command 命令搜索工具

1)介绍 Linux-Command GitHub:https://github.com/jaywcjlove/linux-command Linux-Command 仓库搜集了 580 多个 Linux 命令,是一个非盈利性的仓库,生成了一个 Web 网站方便使用,目前网站没有任何广告,内…