MySQL 已有大数据量表进行分区踩坑

一、背景
mysql 表中已有 4 亿数据,为提高查询效率,需创建分区,一开始计划是创建 HASH 分区,结果报错:
ERROR 1659 (HY000): Field ‘partno‘ is of a not allowed type for this type of partitioning
1

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

KEY 分区语句:

alter table TABLENAME PARTITION BY key(COLUMN) PARTITIONS NUM;
1
TABLENAME :表名
COLUMN:列名
NUM:分区数量

检查分区是否创建成功

EXPLAIN PARTITIONS SELECT * FROM `cars`
1
若成功,结果如下:

踩坑

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

KEY 分区和 HASH 分区的区别

KEY 分区和 HASH 分区相似,但是 KEY 分区支持除 text 和 BLOB 之外的所有数据类型的分区,而 HASH 分区只支持数字分区,KEY 分区不允许使用用户自定义的表达式进行分区,KEY 分区使用系统提供的 HASH 函数进行分区。
当表中存在主键或者唯一键时,如果创建 key 分区时没有指定字段系统默认会首选主键列作为分区字列,如果不存在主键列会选择非空唯一键列作为分区列,注意唯一列作为分区列唯一列不能为null。

查看已分区表的详情

SELECT *
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = ‘TABLE_NAME‘;
123

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

原文地址:https://www.cnblogs.com/xibuhaohao/p/11903470.html

时间: 2024-10-14 23:21:40

MySQL 已有大数据量表进行分区踩坑的相关文章

mysql大数据量表索引与非索引对比

1:不要在大数据量表中轻易改名字(做任何操作都是非常花费时间) 2个多亿数据量的表 改名操作  执行时间花费8分多钟 (如果是加索引等其他操作 那时间花费不可预估) 2:给大数据量的mysql表 添加索引 所花费的时间 如下 在日后生产环境 如果需要给表添加索引等操作 心里要有预估时间的花费范围 3: explain 解释 语句 type:ALL 进行完整的表扫描 .row:213284372  mysql预估需要扫描213284372 条记录来完成这个查询.可想而知 表数据量越大全表扫描越慢.

mysql数据库为什么要分表和分区?

一般下载的源码都带了MySQL数据库的,做个真正意义上的网站没数据库肯定不行. 数据库主要存放用户信息(注册用户名密码,分组,等级等),配置信息(管理权限配置,模板配置等),内容链接(html ,图片,声音,视频等等的路径).那mysql数据库为什么要分表和分区? 为什么要分表和分区? 我们的数据库数据越来越大,随之而来的是单个表中数据太多.以至于查询书读变慢,而且 由于表的锁机制导致应用操作也搜到严重影响,出现了数据库性能瓶颈. mysql 中有一种机制是表锁定和行锁定,是为了保证数据的完整性

MySQL单表数据量过千万,采坑优化记录,完美解决方案

问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死.严重影响业务. 问题前提:老系统,当时设计系统的人大概是大学没毕业,表设计和sql语句写的不仅仅是垃圾,简直无法直视.原开发人员都已离职,到我来维护,这就是传说中的维护不了就跑路,然后我就是掉坑的那个!!! 我尝试解决该问题,so,有个这个日志. 方案概述 方案一:优化现有mysql数据库.优点:不影响现有业务

关于mysql当中给数据量特别大的两个表做关联查询的时候解决查询速度很慢的解决方法

今天碰到了两个表做关联查询的mysql,这两个表的数据量都是特别大的,有一个表的数据是上亿条的数据,有一个是几百万的数据, 查询的速度是特别慢,然后我看了一下执行计划,下面是执行执行计划: 看到上面这个图这个数据量是特别大的,这个查询起来的肯定是非常慢的,而且他的类型都是ALL类型,也就是都是全表进行扫描的.然后在网上找资料,然后发现我们可以给关联的字段建索引. 于是我给关联字段建立了索引,然后就发生了下面的变化: 整个的行数就成不知道多少个数量级的情况在下降,整个的查询速度也是加快了额很多,现

一次MySQL两千万数据大表的优化过程,三种解决方案

问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死.严重影响业务. 问题前提:老系统,当时设计系统的人大概是大学没毕业,表设计和sql语句写的不仅仅是垃圾,简直无法直视.原开发人员都已离职,到我来维护,这就是传说中的维护不了就跑路,然后我就是掉坑的那个!!! 我尝试解决该问题,so,有个这个日志. 方案概述 方案一:优化现有mysql数据库.优点:不影响现有业务

大数据量表结构设计案例

在处理大数据量的表时,会消耗数据库的大量性能,所以,在设计数据库表时,要考虑到此种现象,将数据库设计的合理合法,来提高数据库性能减小数据库压力. 当表记录太多,如产品.的订单.大量客户等,是数据库访问压力的主要来源,此时,从数据库拆分表的角度来减轻压力,可以采用如下两种方法: 1.对表进行水平分割 水平分割:以该表主键PK的某个值为界限,将该表的记录水平拆分为两个表 2.对表进行垂直分割 垂直分割:表字段太多,按照表字段拆分,将一个表垂直分解为两个表 例:有产品表,数据量为10w,数据量稳定:

sql server 对已有数据的表,添加核查约束 [失败],请使用with nocheck 子句

一.在已有数据表中,添加一个约束,但不让这个约束使用到已存在的数据中,在执行ALTER TABLE语句添加时使用WITH NOCHECK子句,这样新增的约束就不会去约束已存在的数据,而只会对新增的数据进行约束检查: alter table [tablename] with nochek add constraint [ ck_XXX] check (核查条件) 二.NOCHECK还可以禁用约束,禁用就不用删除这个约束: alter table [tablename] nocheck constr

怎么快速删除大数据量表

v一.前言 要清空表中数据,100w条数据以上的表,开始我们使用delete from t_user进行删除,这样操作太慢了,需要等好长时间,如果数据量更大,那么我们要等的时间无法想象. 可以用以下方法进行删除 假设要删除的原表为SOURCE_T v二.解决办法 第一步:生成中间表 1 create table SOURCE_T_M as select * from SOURCE_T where id = '111' --任意指定一条符合条件的数据即可 第二步:修改表名 1 rename SOU

大数据量表的优化查询

1:索引,我们最先想到的就是创建索引,创建索引可以成倍的提升查询的效率,节省时间.但是如果数据量太过于巨大的时候,这个时候单纯的创建索引是无济于事的,我们知道假如特别是在大数据量中统计查询,就拿1000W数据来说吧,如果使用count函数的话,最少要50-100秒以上,当然如果你的服务器配置够高,处理够快,或许会少很多但是一样会超过10秒. 单纯的建立索引是无济于事的.我们可以在创建索引的时候给索引加个属性,compress,这个属性可以将所创建的索引进行一个良好的归类,这样的话,查询速度会提升