最近一次日常迭代中,业务线需要对一张大表进行联合查询,查询性能可想而知,测试过程中服务接口直接响应超时,导致服务不可用,最后临时对该表进行分区操作,暂时缓解性能问题。由于是第一次操作表分区,姑且记录一下整个操作过程。

测试表结构

1
2
3
4
5
6
7
8
CREATE TABLE `tb_partition_test` (
`user_id` bigint(20) NOT NULL ,
`city_id` bigint(20) NOT NULL DEFAULT '0',
`record_type` smallint(6) NOT NULL DEFAULT '0',
`record` smallint(6) NOT NULL DEFAULT '0' ,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`user_id`,`record_type`),
ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分区测试';

表应用场景为:存储用户的成绩明细数据,成绩计算有多种不同的维度,每个用户的每个成绩维度只有一个分值。所以整个表按照record_type分组后,每个成绩对应的数据量是一致的,都为用户数量。最后对record_type进行hash分区。

为了不影响生产环境的业务使用,而恰好该表又不会有业务更新操作,故新建一个分区表,将原有表数据导入,采取分块导入的方式,避免产生大量的临时文件。

创建分区表

1
2
3
4
5
6
7
8
9
10
CREATE TABLE `tb_partition_test_part` (
`user_id` bigint(20) NOT NULL ,
`city_id` bigint(20) NOT NULL DEFAULT '0',
`record_type` smallint(6) NOT NULL DEFAULT '0',
`record` smallint(6) NOT NULL DEFAULT '0' ,
`create_time` timestamp NOT NULL DEFAULT 大专栏  记一次MySQL表分区操作 CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`user_id`,`record_type`),
ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分区测试'
PARTITION BY HASH(record_type)
PARTITIONS 100;

数据导入

1
2
3
4
5
for i in {1..100};do
"INSERT IGNORE INTO tb_partition_test_part
SELECT * from tb_partition_test WHERE score_type=$i;"
sleep 5
done

导入完成后修改表名,会有短暂时间的锁表

1
2
3
4
5
6
set AUTOCOMMIT = 0;
BEGIN ;
RENAME TABLE tb_partition_test to tb_partition_test_20170916;
RENAME TABLE tb_partition_test_part to tb_partition_test;
COMMIT ;
set AUTOCOMMIT = 1;

查询性能比较:

通过explain partitions查看执行计划,对于指定record_type的查询,只会在指定的分区中查找,数据按照record_type均匀分区了,前后执行时间比较

1
2
3
4
5
6
+----------+
| count(0) |
+----------+
| 361795 |
+----------+
1 row in set (42.89 sec)
1
2
3
4
5
6
+----------+
| count(0) |
+----------+
| 361795 |
+----------+
1 row in set (3.04 sec)

显然3.04 sec的性能仍是不可接受的,作为相对低频的业务,这只是临时的处理方案,而且恰好因为目前的需求在每次查询都会附带record_type条件,所以可以很好的利用分区提升性能,但如果出现不按照record_type条件的查询,仍然会出现性能瓶颈,需要后端人员以及来进行优化。

参考

  1. https://dev.mysql.com/doc/refman/5.6/en/partitioning-hash.html
  2. http://www.cnblogs.com/chenmh/p/5623474.html
  3. http://blog.csdn.net/zzy7075/article/details/70054818
  4.http://blog.csdn.net/yongchao940/article/details/55266603

记一次MySQL表分区操作的更多相关文章

  1. mysql 表分区操作

    //不支持动态创建分区CREATE TABLE `rpt_exp_event_bucket_creative_d_across` ( `bucket_id` VARCHAR(200) NOT NULL ...

  2. MySQL表的四种分区类型

    MySQL表的四种分区类型 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了600万条,那么就可以根据入库日期将表 ...

  3. [转载]github在线更改mysql表结构工具gh-ost

    GitHub正式宣布以开源的方式发布gh-ost:GitHub的MySQL无触发器在线更改表定义工具! gh-ost是GitHub最近几个月开发出来的,目的是解决一个经常碰到的问题:不断变化的产品需求 ...

  4. 记一次mysql数据库被勒索(中)

    背景在上一篇文章里面已经提过了. 现在面临的问题是nextcloud没有mysql数据库,用不起来了. 因为文件没丢,一种方法是启动新的mysql数据库,把文件重新提交一次. 为了程序员的面子,没有选 ...

  5. MySQL表名和数据库关键字相同解决办法

    今天改他们的代码的时候,遇到了MySQL表名和数据库关键字的问题. 由于表名是关键字,导致增删改查都报错. Hibernate: select leave0_.id as id22_, leave0_ ...

  6. MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)

    一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了1000万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...

  7. 清除mysql表中数据

    delete from 表名; truncate table 表名; 不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也可以清空mysql表中所有内 ...

  8. Python将MySQL表数据写入excel

    背景:将mysql表查询结果写入excel. 1.使用sqlyog工具将查询结果导出到Excel.xml中,用excel打开发现:因为text字段中有回车换行操作,显示结果行是乱的. 2.用mysql ...

  9. mysql表名忽略大小写问题记录

    问题描述:一开发同事在linux下调一个程序老是报错说找不到表,但是登陆mysql,show tables查看明明是已经创建了这张表的!!如下: mysql> show tables; +--- ...

随机推荐

  1. 33)new和delete关键字

    ---------------------------------------------------------------------------------------------------- ...

  2. vue slot插槽v-show不控制显示隐藏

    vue中想控制插槽的显示隐藏,用v-show是不起任何作用的,改用v-if 可以生效.

  3. 限制客户端同账号同IP多终端登录

    打开SoftEther VPN Server Manager工具,连接上节点 1.管理虚拟HUB--管理用户--双击用户--安全策略--最大多重登录数设置为1 2.管理虚拟HUB--虚拟HUB属性-- ...

  4. iOS转场弹窗、网易云音乐动效、圆环取色器、Loading效果等源码

    iOS精选源码 view controller transition and popover (控制器转场和弹窗) UITableView头部悬停+UITableView侧滑嵌套 一行代码集成时间选择 ...

  5. TCP\IP协议簇-各层主要协议帧格式

    本文只是对各协议的概要,详细请参考rfc文件. 官方下载地址:https://tools.ietf.org/rfc/index rfc中文:http://man.chinaunix.net/devel ...

  6. python学习笔记(18)字典和json 的区别 和转换

    字典和json 的区别 和转换 前言:字典和json非常像.接下来比较一下两者的异同 先看一下字典的写法: a = {'a':'1', 'b':'2', 'c':'3' } 再看一下json的写法: ...

  7. VisualStudioAddin2016Setup.rar

    本工具是用于Visual Studio 2010 /2012 的外接程序. 功能不太多,常用代码,引用管理等. 动态图: 下载地址: VisualStudioAddin2016Setup.rar

  8. 依赖注入&控制反转

    IoC——Inversion of Control  控制反转DI——Dependency Injection   依赖注入 要想理解上面两个概念,就必须搞清楚如下的问题: 参与者都有谁? 依赖:谁依 ...

  9. cashier|gasoline|reservoir

    N-COUNT 出纳(员);收银员A cashier is a person who customers pay money to or get money from in places such a ...

  10. win10安装3DMAX失败,怎么强力卸载删除注册表并重新安装

    一些搞设计的朋友在win10系统下安装3DMAX失败或提示已安装,也有时候想重新安装3DMAX的时候会出现本电脑windows系统已安装3DMAX,你要是不留意直接安装3DMAX,只会安装3DMAX的 ...