详细介绍mysql中的分区

概述

 之前,看到分区,我捏个去,好高大上哟。昨天终于知道了分区是个啥玩意,也不过如此,今天总结一下,好记性不如烂笔头嘛。
mysql从5.1开始支持分区功能。分区一句话就是:把一张表按照某种规则(range/list/hash/key等)分成多个区域(页/文件)保存。对mysql应用开发来说,分区与不分区是没区别的(即对应用是透明的)。如同突围战中的“化整为零”。mysql支持大部分的存储引擎(如:myisam、innodb、memory等)创建分区,不支持merge和csv来创建分区。同一个分区表中的所有分区必须是同一个存储引擎。做一个引例:

#创建一个5个hash分区的myisam表CREATE TABLE `test`.`partition_t1`(    `id` INT UNSIGNED NOT NULL,  `username` VARCHAR(30) NOT NULL,  `email` VARCHAR(30) NOT NULL,  `birth_date` DATE NOT NULL) ENGINE=MYISAMPARTITION BY HASH(MONTH(birth_date))PARTITIONS 5;

详细介绍mysql中的分区

引例结果

分区作用

可以存储更多的数据(系统单个文件最大限制)

优化查询,在where子句中,如果包含分区条件,只需要扫描一个或部分分区来提高查询效率。在涉及sum()这类函数时候, 可以在分区上并行处理,最后汇总结果。

对于过期或不需要的数据,可以删除相关分区来快速删除数据。

跨多个磁盘来分散数据查询,单表的并发能力提高了,磁盘I/O性能也提高了。

分区类型

分为4种:

range分区:基于一个给定的连续区间范围,把数据分配到不同的分区中。

list分区:类似range分区,区别在于list是基于枚举出的值列表分区,range是根据范围来分区的。

hash分区:基于给定的分区个数,把数据分配到不同分区(取模/线性)

key分区:类似于hash分区。

MySQL5.1中range,list,hash分区要求分区键必须是int。MySQL5.5及以上,支持非整型的range和list分区,即:range columns 和 list columns。
注意:无论哪种分区,要么分区表上没有主键/唯一键,要么分区键必须有一个是主键/唯一键。

1.range分区

range分区是利用取值范围(区间)划分分区,区间要连续并且不能互相重叠,使用values less than操作符进行分区定义。

例一:

CREATE TABLE `test`.`partition_t2`(    `id` INT UNSIGNED NOT NULL,  `username` VARCHAR(30) NOT NULL,  `email` VARCHAR(30) NOT NULL,  `birth_date` DATE NOT NULL) ENGINE=MYISAMPARTITION BY RANGE(id)(   PARTITION t21 VALUES LESS THAN (10),   PARTITION t22 VALUES LESS THAN (20),   PARTITION t23 VALUES LESS THAN MAXVALUE);

上例中定义了一个包含3个分区(t21,t22,t23)的range分区表,这个有点类似与高级语言中的switch语句。解释如下:当idid>=10的时候,在t22分区;当id>=20时候,在t23分区。

例二:

CREATE TABLE `test`.`partition_t3`(    `id` INT UNSIGNED NOT NULL,  `username` VARCHAR(30) NOT NULL,  `email` VARCHAR(30) NOT NULL,  `birth_date` DATE NOT NULL) ENGINE=MYISAMPARTITION BY RANGE COLUMNS(birth_date)(   PARTITION t31 VALUES LESS THAN ('1996-01-01'),   PARTITION t32 VALUES LESS THAN ('2006-01-01'),   PARTITION t33 VALUES LESS THAN ('2038-01-01'));

MySQL5.5改进range分区,提供range columns分区支持非整数分区。

2.list分区

list分区创建离散的值列表(类似mysql中的enum类型数据)来划分分区,使用values in操作符来分区。list分区不必要声明任何特定的顺序的。list有很多方面类似于range。

CREATE TABLE `test`.`partition_t4`(    `id` INT UNSIGNED NOT NULL,  `username` VARCHAR(30) NOT NULL,  `email` VARCHAR(30) NOT NULL,  `birth_date` DATE NOT NULL) ENGINE=MYISAMPARTITION BY LIST(id)(   PARTITION t41 VALUES IN (1,2),   PARTITION t42 VALUES IN (3,6),   PARTITION t43 VALUES IN (5,4),   PARTITION t44 VALUES IN (7,8));

上面的例子是,当id为1或2,在t41分区;当id为3或6,在t42分区,以此类推…

3.hash分区

hash分区主要用来分散热点读取,确保数据在预定确定个数分区中尽可能的平均分布。一个表执行hash分区,mysql会对分区键应用一个散列函数,以此确定数据应该放在n个分区中的哪一个分区。hash分区支持两种散列函数(分区方式):取模算法(默认hash分区方式)线性的2的幂的运算法则(liner hash 分区)

常规hash分区

#顶部引例就是常规hash分区

mysql不推荐使用涉及多列的hash表达式。

常规hash在分区管理上带来的代价太大了,不适合灵活变动的分区的需求。参见:一致性哈希算法

稿定AI社区 稿定AI社区

在线AI创意灵感社区

稿定AI社区 60 查看详情 稿定AI社区

因为常规hash分区在管理上的问题,所有mysql引入线性hash分区。

线性hash分区

CREATE TABLE `test`.`partition_t5`(  `id` INT UNSIGNED NOT NULL,`username` VARCHAR(30) NOT NULL,`email` VARCHAR(30) NOT NULL,`birth_date` DATE NOT NULL) ENGINE=MYISAMPARTITION BY LINEAR HASH(id)PARTITIONS 5;

上例中,创建一个5个分区的线性hash分区。

线性hash分区优点:在分区维护上,mysql能够处理更加迅速;

线性hash分区缺点:分区各个分区之间数据分布不太均衡。

4.key分区

hash分区允许用户自定义的表达式,而key分区不允许使用用户自定义的表达式。

hash分区只支持整数分区,key分区支持除了blob或text类型之外的其他数据类型分区。

与hash分区不同,创建key分区表的时候,可以不指定分区键,默认会选择使用主键/唯一键作为分区键,没有主键/唯一键,必须指定分区键。

CREATE TABLE `test`.`partition_t6`(    `id` INT UNSIGNED NOT NULL,  `username` VARCHAR(30) NOT NULL,  `email` VARCHAR(30) NOT NULL,  `birth_date` DATE NOT NULL) ENGINE=MYISAMPARTITION BY LINEAR KEY(email)PARTITIONS 5;

columns 与子分区

1.columns分区

columns 包括range columns与list columns 支持非整型的分区键。columns分区支持多列分区

CREATE TABLE `test`.`partition_t7`(    `a` INT UNSIGNED NOT NULL,  `b` INT UNSIGNED NOT NULL)PARTITION BY RANGE COLUMNS(a,b)(    PARTITION p0 VALUES LESS THAN (0,10),    PARTITION p1 VALUES LESS THAN (10,10),    PARTITION p2 VALUES LESS THAN (10,20),    PARTITION p3 VALUES LESS THAN (10,35),    PARTITION p4 VALUES LESS THAN (10,MAXVALUE),    PARTITION p5 VALUES LESS THAN (MAXVALUE,MAXVALUE));

判断依据:(a<10) or ((1=10) and (10<10))。

2.子分区

子分区是分区表中对每一个分区的再次分割,又被称为复合分区。MySQL从MySQL5.1开始支持对通过range和list的表再进行子分区,子分区即可以hash分区,也可以使用key分区。子分区适合保存非常大量的数据记录。

CREATE TABLE partition_t8(id INT,purchased DATE)PARTITION BY RANGE(YEAR(purchased))SUBPARTITION BY HASH(TO_DAYS(purchased))SUBPARTITIONS 2(    PARTITION p0 VALUES LESS THAN (1990),    PARTITION p1 VALUES LESS THAN (2000),    PARTITION p2 VALUES LESS THAN MAXVALUE);

详细介绍mysql中的分区

mysql子分区

分区管理

MySQL5.1提供添加、删除、重定义、合并、拆分分区命令。

1.range或list分区

#删除分区alter table partition_t8 drop partition p2;#添加一个分区alter table partition_t8 add partition(    partition p4 values less than (2030)    )#重定义一个分区alter table partition_t8 reorganize partition p3 into(    partition p2 values less than (2005),    partition p3 values less than (2015));

只能从range分区列表最大端增加分区。

增加list分区,不能添加一个包含现有分区值列表中的任意值分区,也就是说对一个固定的分区键值,必须指定并且只能指定一个唯一的分区。

重新定义range分区,只能够重新定义相邻的分区,同时重新定义的分区区间必须和原分区区间覆盖相同的区间。

2.hash或key分区

#减少分区数,(如将分区数减少到2)alter table partition_t8 coalesce partition 2;#增加分区数(如:为分区数增加了8)alter table partiton_t8 add partition partitions 8;

coalesce不能用来增加分区数量。

【相关推荐】

1. 免费mysql在线视频教程

2. where子句0

3.where子句1

以上就是详细介绍mysql中的分区的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/412811.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Win10怎么去掉任务栏的资讯和兴趣?
上一篇 2025年11月6日 23:57:17
java数组的长度怎么表示
下一篇 2025年11月6日 23:57:26

相关推荐

  • mysql下载初始化数据库失败怎么回事

    mysql下载初始化数据库失败怎么回事mysql下载初始化数据库失败怎么回事mysql下载初始化数据库失败怎么回事mysql下载初始化数据库失败怎么回事

    MySQL 初始化数据库失败的原因包括:1. 系统权限不足;2. 安装文件损坏;3. 防火墙或安全软件阻止连接;4. 数据库端口冲突;5. 磁盘空间不足;6. 操作系统版本不兼容;7. 环境变量问题;8. 损坏的配置文件;9. 之前的 MySQL 安装残留;10. 其他错误。请检查这些原因并采取相应…

    2026年9月24日 用户投稿
    000
  • 袋鼠数据库工具 8.90.1 版已上线

    袋鼠数据库工具 8.90.1 版已上线袋鼠数据库工具 8.90.1 版已上线袋鼠数据库工具 8.90.1 版已上线袋鼠数据库工具 8.90.1 版已上线

    袋鼠数据库工具 是一款由 ai 驱动的主流数据库系统客户端,支持多种数据库类型,包括 mariadb、mongodb、mysql、oracle、postgresql、redis、sqlite、sqlserver 等,具备建表、数据查询、模型设计、结构同步、数据导入导出等丰富功能。兼容 windows…

    2026年9月24日 用户投稿
    000
  • Java程序Ubuntu上如何备份

    在ubuntu上备份java程序,你可以遵循以下步骤: 确定备份位置:首先,你需要确定一个安全的位置来存储备份文件。这可以是一个外部硬盘、网络驱动器或其他任何可靠的存储设备。 打包Java项目:你可以使用tar命令将整个Java项目打包成一个压缩文件。例如,如果你的项目位于/home/usernam…

    2026年9月24日
    000
  • mysql下载初始化数据库失败怎么解决

    mysql下载初始化数据库失败怎么解决mysql下载初始化数据库失败怎么解决mysql下载初始化数据库失败怎么解决mysql下载初始化数据库失败怎么解决

    MySQL 初始化数据库失败可通过以下步骤解决:1. 检查安装程序版本;2. 确保管理员权限;3. 关闭其他应用程序;4. 重新配置 MySQL 配置文件(取消注释 innodb_flush_log_at_trx_commit 并设置 innodb_file_per_table、innodb_log…

    2026年9月24日 用户投稿
    000
  • mysql数据库怎么实现

    mysql数据库怎么实现mysql数据库怎么实现mysql数据库怎么实现mysql数据库怎么实现

    MySQL数据库实现步骤:安装MySQL服务器;创建数据库;创建用户并授予权限;连接到数据库;创建表;插入数据;查询数据;修改数据;删除数据;备份数据库。 MySQL数据库实现 如何实现MySQL数据库? 实现MySQL数据库涉及以下步骤: 1. 安装MySQL服务器 从MySQL官方网站下载并安装…

    2026年9月24日 用户投稿
    000
  • mysql数据库的完整步骤有哪些

    mysql数据库的完整步骤有哪些mysql数据库的完整步骤有哪些mysql数据库的完整步骤有哪些mysql数据库的完整步骤有哪些

    创建 MySQL 数据库步骤:安装 MySQL、创建数据库、创建表、插入数据、检索数据、更新数据、删除数据,维护数据库。具体步骤:安装 MySQL使用语法 CREATE DATABASE 创建数据库使用语法 CREATE TABLE 创建表使用语法 INSERT INTO 插入数据使用语法 SELE…

    2026年9月24日 用户投稿
    200
  • mysql储存过程中循环语句有哪些

    mysql储存过程中循环语句有哪些mysql储存过程中循环语句有哪些mysql储存过程中循环语句有哪些mysql储存过程中循环语句有哪些

    MySQL存储过程中提供WHILE和REPEAT两种循环语句:WHILE循环:根据条件重复执行代码块,条件为真时继续执行。REPEAT循环:先执行代码块,再检查条件是否为真,为假则再次执行代码块。 MySQL存储过程中的循环语句 MySQL存储过程中支持以下两种循环语句: WHILE 循环 WHIL…

    2026年9月24日 用户投稿
    000
  • mysql存储过程保存在哪

    mysql存储过程保存在哪mysql存储过程保存在哪mysql存储过程保存在哪mysql存储过程保存在哪

    MySQL 存储过程保存在 mysql.proc 表中,该表存储了存储过程的所有信息,包括名称、定义、创建者和修改时间。 MySQL 存储过程保存在哪里? MySQL 中的存储过程保存在数据库的 mysql.proc 表中。这个表存储了所有在数据库中创建的存储过程的信息。 表结构 mysql.pro…

    2026年9月24日 用户投稿
    1700
  • 如何在Debian 10(Buster)Linux上安装MySQL

    了解如何在debian 10(buster)linux上安装mysql。本指南将引导您完成在最新版本的debian系统上安装mysql 8或mysql 5.7的步骤。 第1步 – 准备工作 首先,确保您拥有Debian 10系统的shell访问权限。如果是远程系统,可以通过SSH连接。W…

    2026年9月24日
    1000
  • mysql存储过程在哪里写

    mysql存储过程在哪里写mysql存储过程在哪里写mysql存储过程在哪里写mysql存储过程在哪里写

    MySQL 存储过程存储在 MySQL 数据库中的 mysql.proc 表中。创建存储过程需要使用 CREATE PROCEDURE 语句,调用存储过程需要使用 CALL 语句。 MySQL 存储过程存储位置 存储过程在哪里写? MySQL 存储过程存储在 MySQL 数据库中。 详细说明: 存储…

    2026年9月24日 用户投稿
    500
  • 怎么在mysql中创建一个表 mysql新建数据表步骤教程

    在 mysql 中创建表的步骤和建议包括:1. 明确业务需求,设计表结构;2. 使用 create table 语句创建表,选择合适的数据类型和设置主键、索引;3. 考虑大数据量时使用分区;4. 设置正确的字符集和排序规则;5. 谨慎使用索引;6. 使用 if not exists 避免重复创建表。…

    2026年9月24日
    100
  • mysql全文索引是什么意思

    mysql全文索引是什么意思mysql全文索引是什么意思mysql全文索引是什么意思mysql全文索引是什么意思

    MySQL 全文索引是一种特殊索引,用于提高全文搜索性能,通过存储单词的前缀来工作。它提供快速全文搜索、简易查询和部分匹配。要创建全文索引,可以使用 CREATE FULLTEXT INDEX 语法,例如:CREATE FULLTEXT INDEX index_name ON table_name …

    2026年9月24日 用户投稿
    100
  • 学好mysql数据库能找到什么工作

    学好mysql数据库能找到什么工作学好mysql数据库能找到什么工作学好mysql数据库能找到什么工作学好mysql数据库能找到什么工作

    掌握 MySQL 数据库可为求职者带来众多工作机会,包括数据库管理员、数据库开发人员、数据分析师、数据科学家、商业智能分析师、软件工程师、Web 开发人员、测试工程师和数据挖掘工程师。 学好 MySQL 数据库能找到哪些工作? 精通 MySQL 数据库可为求职者创造众多职业机会,包括: 数据库管理员…

    2026年9月24日 用户投稿
    300
  • mysql的全文检索是什么

    mysql的全文检索是什么mysql的全文检索是什么mysql的全文检索是什么mysql的全文检索是什么

    摘要:MySQL 全文检索是一种在文本中搜索单词或短语的技术。其工作原理是:将文本拆分为标记并存储在全文索引中。匹配文本列中标记的搜索词或短语。提供快速搜索、相关性排序、模糊搜索和部分匹配功能。 MySQL 全文检索 全文检索是一种用于在文本内容中搜索单词或短语的技术。MySQL 中的全文检索功能允…

    2026年9月24日 用户投稿
    200
  • mysql中rand的用法 mysql随机函数使用教程

    mysql 的 rand() 函数返回 0 到 1 之间的随机浮点数,用于随机选择和排序数据。1)随机排序:select from your_table order by rand()。2)随机抽取记录:select from your_table order by rand() limit 10。…

    2026年9月24日
    300
  • mysql临时表如何使用_PHP中操作mysql临时表的具体步骤

    MySQL临时表仅在当前会话可见,连接关闭后自动删除,适合中间数据处理。使用PHP操作时,先通过mysqli或PDO建立数据库连接,再执行CREATE TEMPORARY TABLE语句创建临时表,随后可像普通表一样进行INSERT、SELECT及JOIN等操作。临时表可与永久表同名且优先被使用,支…

    2026年9月24日
    100
  • mysql中*是什么意思 mysql星号通配符解析

    在 mysql 中,星号()最常用于 select 语句中代表所有列,但应谨慎使用。1)它方便查看所有数据,但可能返回不必要的数据,影响性能。2)使用可能降低代码可维护性,建议明确列出所需列。3)在like操作符中,不是通配符,需用regexp。4)在视图中使用可能导致定义失效。5)可结合limit…

    2026年9月24日
    100
  • MySQL中SQL注入防范 SQL注入攻击的预防与应对措施

    sql注入的防范核心在于参数化查询。具体措施包括:1.始终使用参数化查询,将用户输入视为数据而非可执行代码;2.对输入进行过滤与校验,如验证格式、转义特殊字符;3.遵循最小权限原则,限制数据库账号权限;4.控制错误信息输出,避免暴露敏感细节;5.定期更新框架与插件,及时修补漏洞。这些方法结合使用能有…

    2026年9月24日
    100
  • 如何在mysql中升级高可用集群

    先确认版本兼容性、应用依赖及备份完整性,再按架构选择升级路径。对Group Replication或InnoDB Cluster采用滚动升级,先升从节点最后升主节点;MHA/Orchestrator架构先升备库再切换主库;PXC需停集群全量升级。替换二进制后启动实例并运行mysql_upgrade,…

    2026年9月24日
    100
  • MySQL怎样处理SQL注入风险 参数化查询与特殊字符过滤方案

    MySQL怎样处理SQL注入风险 参数化查询与特殊字符过滤方案MySQL怎样处理SQL注入风险 参数化查询与特殊字符过滤方案MySQL怎样处理SQL注入风险 参数化查询与特殊字符过滤方案MySQL怎样处理SQL注入风险 参数化查询与特殊字符过滤方案

    参数化查询和特殊字符过滤是防止sql注入的有效方法。1. 参数化查询通过预处理语句将sql结构与数据分离,用户输入被视为参数,不会被解释为sql命令;2. 特殊字符过滤通过转义或拒绝单引号、双引号等危险字符来阻止攻击;3. 定期审查mysql安全配置,包括更新版本、限制权限、启用日志、使用防火墙和扫…

    2026年9月24日 用户投稿
    100

发表回复

登录后才能评论
关注微信