0

0

mysql存储引擎如何支持分区表_mysql分区优化与引擎设计

P粉602998670

P粉602998670

发布时间:2026-02-07 09:14:03

|

957人浏览过

|

来源于php中文网

原创

MySQL分区表仅支持InnoDB,MyISAM虽语法允许但不执行分区逻辑且已废弃;ARCHIVE等引擎直接报错;分区键必须包含在主键或唯一键中;需避免函数导致分区裁剪失效;分区数不宜超过50个。

mysql存储引擎如何支持分区表_mysql分区优化与引擎设计

MySQL 分区表只支持 InnoDB 和 MyISAM,但 MyISAM 已被弃用

MySQL 8.0 起,CREATE TABLE ... PARTITION BY 语句仅允许在 InnoDB 存储引擎上创建分区表;MyISAM 虽语法上仍接受分区定义,但实际不执行分区逻辑(写入全落一个分区),且官方已标记为废弃。使用 ARCHIVEMEMORYCSV 等引擎尝试建分区表会直接报错:ERROR 1031 (HY000): Table storage engine for 't' doesn't support partitioning

实操建议:

  • 新项目必须用 InnoDB + 分区,不要碰 MyISAM 分区
  • 升级老系统前检查 SHOW CREATE TABLE t 是否含 ENGINE=MyISAMPARTITION BY,这类表需先转引擎再验证分区行为
  • InnoDB 分区本质是多个独立的 .ibd 文件(每个分区一个),不是逻辑切分,所以 innodb_file_per_table=ON 必须启用

分区键必须是主键/唯一键的全部组成部分

这是最常踩的坑:定义 PARTITION BY RANGE/LIST/HASH 时,分区表达式里涉及的列,必须包含在表的每个唯一约束(含主键)中。否则建表失败:ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function

比如这张表会失败:

CREATE TABLE logs (
  id BIGINT PRIMARY KEY,
  dt DATE,
  msg TEXT
) ENGINE=InnoDB
PARTITION BY RANGE (YEAR(dt)) (
  PARTITION p2023 VALUES LESS THAN (2024),
  PARTITION p2024 VALUES LESS THAN (2025)
);

因为 id 是主键,但分区函数只用了 dt,没包含 id。修复方式只有两种:

  • dt 加进主键:PRIMARY KEY (id, dt)(注意顺序,dt 放后面不影响查询效率)
  • 改用 KEY(dt)HASH(YEAR(dt)),但前提是主键本身含 dt 或声明 UNIQUE KEY(dt)

没有“绕过”办法——这是 InnoDB 分区的硬性索引一致性要求。

小K直播姬
小K直播姬

全球首款AI视频动捕虚拟直播产品

下载

分区裁剪失效的典型场景和验证方法

分区的价值全靠查询时的 partition pruning(分区裁剪)。但很多看似能裁剪的 WHERE 条件,实际无法触发裁剪。常见失效点:

  • 对分区字段用了函数:WHERE YEAR(dt) = 2024 → 不裁剪;必须写成 WHERE dt >= '2024-01-01' AND dt
  • 分区字段参与了计算:WHERE dt + INTERVAL 1 DAY > '2024-01-01' → 不裁剪
  • 使用了非确定性函数:WHERE dt > NOW() → 优化器无法预判分区范围
  • JOIN 中分区表作为被驱动表,且 ON 条件未覆盖分区键 → 可能全分区扫描

验证是否裁剪:执行 EXPLAIN PARTITIONS SELECT ...,看 partitions 列是否只列出目标分区(如 p2024),而不是 p2023,p2024,p2025NULL

分区数量不是越多越好,50 个以上要警惕

InnoDB 对单表分区数没有硬上限,但超多分区会显著拖慢 DDL 和查询优化阶段:

  • ALTER TABLE ... REORGANIZE PARTITION 会锁整个表,分区越多,元数据操作越慢
  • 优化器估算执行计划时需遍历所有分区的统计信息,分区数 > 50 时 EXPLAIN 延迟明显上升
  • 每个分区对应独立的 .ibd 文件,海量小分区易触发文件系统 inode 耗尽或 open file limit 问题
  • 备份工具(如 mysqldump --tab 或物理备份)需逐个处理分区文件,恢复时间线性增长

真实建议:按月分区最多支撑 3–5 年历史数据(36–60 个分区);按天分区慎用,除非单日数据量稳定在 GB 级且查询极度聚焦最近 N 天;用 RANGE COLUMNS 替代多层嵌套函数,能减少分区管理复杂度。

分区不是银弹,它解决的是数据生命周期管理和大范围扫描的物理隔离问题,不是替代索引或分库分表的通用方案。真正卡住性能的,往往在分区之外。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

670

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

329

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

282

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

517

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

259

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

387

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

536

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

630

2023.08.14

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.1万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 823人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号