本站承诺永不接任何虚假欺骗、联盟广告、弹窗广告、病毒广告、诱导充值等影响用户体验的广告,广告屏蔽插件会影响本站部分功能,还请不要屏蔽本站广告,感谢支持!

当前位置:首页 / 正文

2019-10-29 | 编程技术 | 17488 次阅读 | 等你评论 | 9 次点赞 | 繁体

一、背景

mysql 表中已有 4 亿数据,为提高查询效率,需创建分区,一开始计划是创建 HASH 分区,结果报错:

ERROR 1659 (HY000): Field '**' is of a not allowed type for this type of partitioning

在这里插入图片描述

查询得知报错原因,HASH 分区只支持数字分区,而我要分区的字段是 varchar 类型,故改用 KEY 分区

二、解决

  1. KEY 分区语句
alter table TABLENAME PARTITION BY key(COLUMN) PARTITIONS NUM;

TABLENAME :表名
COLUMN:列名
NUM:分区数量

  1. 检查分区是否创建成功
EXPLAIN PARTITIONS SELECT * FROM `cars`

若成功,结果如下:

在这里插入图片描述

  1. 踩坑

拿小表测试 100 个分区发现,分区不均匀,一半分区有数据,一半没有数据,网上查询得知:key 分区,只有指定分区数目为质数,才能保证每个分区都有数据。

小表测试分区 97 个,分布均匀。

附:100以内质数表

100以内质数表

三、其他

  1. KEY 分区和 HASH 分区的区别

KEY 分区和 HASH 分区相似,但是 KEY 分区支持除 text 和 BLOB 之外的所有数据类型的分区,而 HASH 分区只支持数字分区,KEY 分区不允许使用用户自定义的表达式进行分区,KEY 分区使用系统提供的 HASH 函数进行分区。

当表中存在主键或者唯一键时,如果创建 key 分区时没有指定字段系统默认会首选主键列作为分区字列,如果不存在主键列会选择非空唯一键列作为分区列,注意唯一列作为分区列唯一列不能为null。

  1. 查看已分区表的详情
SELECT *
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 'TABLE_NAME';

参考文章:
https://blog.csdn.net/echo_hello_world/article/details/80693224
https://bbs.csdn.net/topics/390857704
https://blog.csdn.net/jhq0113/article/details/44593511

标签: mysql数据库

猜你喜欢
如何定位Mysql中CPU占用高的查询语句
今天 mysql 服务器突然 CPU 告警,记录一下问题查找的过程第一步查看具体是哪个线程占用CPU最高1、在 Linux 中使用 top 命令找到 mysql 进程 PID2、指定进程 PID...
mysql8利用CTE特性实现递归查询
递归查询分为父子查询和子父查询。父子查询: 根据父 id 查询下面所有子节点数据;子父查询: 根据子 id 查询上面所有父节点数据;下边就利用 mysql8 新增语法实现递归查询,表结构及数...
mysql数据库删除重复的数据只保留一条
问题引入假设一个场景,一张用户表,包含 3 个字段:id,identity_id,name。现在身份证号 identity_id 和姓名 name 有很多重复的数据,需要删除多余数据只保留一条有...
Mysql 窗口函数学习
窗口函数是数据库查询中的一个经典场景,在解决某些特定问题时甚至是必须的。个人认为,在单纯的数据库查询语句层面【即不考虑 DML、SQL 调优、索引等进阶】,窗口函数可看作是考察求职者 SQL 功...
typecho使用文件缓存加快打开速度
typecho 是一个伪静态的博客系统,如果不使用缓存,每次打开页面都会查询数据库,访问人数多了以后服务器压力倍增。 但是,typecho 是一个 php 的程序,我们可以利用 php 将实时页
拯救服务器硬盘,找回被 CentOS“偷”的硬盘
偶然间发现自己的 CentOS 系统的 VPS 实际可用空间少了不少。虽然面板上显示是正确的,但是实际可用的居然缩水近 10% 。难道黑心的宝塔偷了我的 10% 硬盘? 谷歌了下原来是 Cent
(首次提交评论需审核通过才会显示,请勿重复提交)