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

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

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

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

实操建议:

  • 新项目必须用 InnoDB + 分区,不要碰 MyISAM 分区
  • 升级老系统前检查 SHOW CREATE TABLE t 是否含 ENGINE=MyISAM 和 PARTITION 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 分区的硬性索引一致性要求。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » mysql存储引擎如何支持分区表_mysql分区优化与引擎设计-mysql教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4029912+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4029912+
  • 本周更新: 0+
  • 最后更新: 2026-03-16