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

测试表结构

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. zabbix自定义添加主机

    1.安装zabbix-agent [root@web01 ~]# rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/3.4/rhe ...

  2. 理解python的可变参数

    以 str.format(*args,**kwargs) 为例. "type1:{},{},{},{}_type2:{a},{b},{c},{d}".format('a',2,*[ ...

  3. vncserver

    ## install packages yum install tigervnc-server xhost ## start vnc and xhost vncserver export DISPLA ...

  4. 吴裕雄--天生自然 pythonTensorFlow自然语言处理:PTB 语言模型

    import numpy as np import tensorflow as tf # 1.设置参数. TRAIN_DATA = "F:\TensorFlowGoogle\\201806- ...

  5. 吴裕雄--天生自然C语言开发:共同体

    union [union tag] { member definition; member definition; ... member definition; } [one or more unio ...

  6. mac用python读取文件常见问题(未完成)

    python读取文件常见问题(mac版) 让python的默认编码,和文件的编码保持一致

  7. [LC] 76. Minimum Window Substring

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  8. 80)PHP,扩展工具类

    啥是扩展工具类:这个问题很深奥,自己慢慢理解吧. 首先  对于session的处理函数是扩展工具类. ②图片处理类 ③验证码生成类 ④算是项目中的一个功能模块. 扩展工具类   放在我们的framew ...

  9. python数据类型:Number数字

    Python Number数据类型用于存储数值 数据类型是不允许改变的,如果改变Number数据类型的值,将从新分配内存空间 整型(int):整型或整数,是正或者负整数,不带小数点 长整型(long) ...

  10. Margin of Error|sample size and E

    8.3 Margin of Error 由该公式可知: To improve the precision of the estimate, we need to decrease the margin ...