Mysql的安装方法可以参考:

http://blog.csdn.net/jhq0113/article/details/43812895

Mysql分区表的介绍可以参考:

http://blog.csdn.net/jhq0113/article/details/44592865

1.检查你的Mysql是否支持分区

mysql> SHOW VARIABLES LIKE '%partition%';

若结果如下,表示你的Mysql支持表分区:

+-----------------------+-------+

       | Variable_name         | Value |
       +-----------------------+-------+
       | have_partition_engine | YES   |
       +-----------------------+-------+
       1 row in set (0.00 sec)

RANGE分区表创建方式:

DROP TABLE IF EXISTS `my_orders`;
CREATE TABLE `my_orders` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '表主键',`pid` int(10) unsigned NOT NULL COMMENT '产品ID',`price` decimal(15,2) NOT NULL COMMENT '单价',`num` int(11) NOT NULL COMMENT '购买数量',`uid` int(10) unsigned NOT NULL COMMENT '客户ID',`atime` datetime NOT NULL COMMENT '下单时间',`utime` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '修改时间',`isdel` tinyint(4) NOT NULL DEFAULT '0' COMMENT '软删除标识',PRIMARY KEY (`id`,`atime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8/*********分区信息**************/
PARTITION BY RANGE (YEAR(atime))
(PARTITION p0 VALUES LESS THAN (2016),PARTITION p1 VALUES LESS THAN (2017),PARTITION p2 VALUES LESS THAN MAXVALUE
);

以上是一个简单的订单表,分区字段是atime,根据RANGE分区,这样当你向该表中插入数据的时候,Mysql会根据YEAR(atime)的值进行分区存储。

检查分区是否创建成功,执行查询语句:

EXPLAIN PARTITIONS SELECT * FROM `my_orders`

若成功,结果如下:

性能分析:

1).创建同样表结构,但没有进行分区的表

DROP TABLE IF EXISTS `my_order`;
CREATE TABLE `my_order` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '表主键',`pid` int(10) unsigned NOT NULL COMMENT '产品ID',`price` decimal(15,2) NOT NULL COMMENT '单价',`num` int(11) NOT NULL COMMENT '购买数量',`uid` int(10) unsigned NOT NULL COMMENT '客户ID',`atime` datetime NOT NULL COMMENT '下单时间',`utime` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '修改时间',`isdel` tinyint(4) NOT NULL DEFAULT '0' COMMENT '软删除标识',PRIMARY KEY (`id`,`atime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2).向两张表中插入相同的数据

/**************************向分区表插入数据****************************/
INSERT INTO my_orders(`pid`,`price`,`num`,`uid`,`atime`) VALUES(1,12.23,1,89757,CURRENT_TIMESTAMP());
INSERT INTO my_orders(`pid`,`price`,`num`,`uid`,`atime`) VALUES(1,12.23,1,89757,'2016-05-01 00:00:00');
INSERT INTO my_orders(`pid`,`price`,`num`,`uid`,`atime`) VALUES(1,12.23,1,89757,'2017-05-01 00:00:00');
INSERT INTO my_orders(`pid`,`price`,`num`,`uid`,`atime`) VALUES(1,12.23,1,89757,'2018-05-01 00:00:00');
INSERT INTO my_orders(`pid`,`price`,`num`,`uid`,`atime`) VALUES(1,12.23,1,89756,'2015-05-01 00:00:00');
INSERT INTO my_orders(`pid`,`price`,`num`,`uid`,`atime`) VALUES(1,12.23,1,89756,'2016-05-01 00:00:00');
INSERT INTO my_orders(`pid`,`price`,`num`,`uid`,`atime`) VALUES(1,12.23,1,89756,'2017-05-01 00:00:00');
INSERT INTO my_orders(`pid`,`price`,`num`,`uid`,`atime`) VALUES(1,12.23,1,89756,'2018-05-01 00:00:00');/**************************向未分区表插入数据****************************/
INSERT INTO my_order(`pid`,`price`,`num`,`uid`,`atime`) VALUES(1,12.23,1,89757,CURRENT_TIMESTAMP());
INSERT INTO my_order(`pid`,`price`,`num`,`uid`,`atime`) VALUES(1,12.23,1,89757,'2016-05-01 00:00:00');
INSERT INTO my_order(`pid`,`price`,`num`,`uid`,`atime`) VALUES(1,12.23,1,89757,'2017-05-01 00:00:00');
INSERT INTO my_order(`pid`,`price`,`num`,`uid`,`atime`) VALUES(1,12.23,1,89757,'2018-05-01 00:00:00');
INSERT INTO my_order(`pid`,`price`,`num`,`uid`,`atime`) VALUES(1,12.23,1,89756,'2015-05-01 00:00:00');
INSERT INTO my_order(`pid`,`price`,`num`,`uid`,`atime`) VALUES(1,12.23,1,89756,'2016-05-01 00:00:00');
INSERT INTO my_order(`pid`,`price`,`num`,`uid`,`atime`) VALUES(1,12.23,1,89756,'2017-05-01 00:00:00');
INSERT INTO my_order(`pid`,`price`,`num`,`uid`,`atime`) VALUES(1,12.23,1,89756,'2018-05-01 00:00:00');

3).主从复制,大约20万条左右(主从复制的数据和真实环境有差距,但是能体现出表分区查询的性能优劣)

/**********************************主从复制大量数据******************************/
INSERT INTO `my_orders`(`pid`,`price`,`num`,`uid`,`atime`) SELECT `pid`,`price`,`num`,`uid`,`atime` FROM `my_orders`;
INSERT INTO `my_order`(`pid`,`price`,`num`,`uid`,`atime`) SELECT `pid`,`price`,`num`,`uid`,`atime` FROM `my_order`;

4).查询测试

/***************************查询性能分析**************************************/
SELECT * FROM `my_orders` WHERE `uid`=89757 AND `atime`< CURRENT_TIMESTAMP();
/****用时0.084s****/SELECT * FROM `my_order` WHERE `uid`=89757 AND `atime`< CURRENT_TIMESTAMP();
/****用时0.284s****/

通过以上查询可以明显看出进行表分区的查询性能更好,查询所花费的时间更短。

分析查询过程:

EXPLAIN PARTITIONS SELECT * FROM `my_orders` WHERE `uid`=89757 AND `atime`< CURRENT_TIMESTAMP();

EXPLAIN PARTITIONS SELECT * FROM `my_order` WHERE `uid`=89757 AND `atime`< CURRENT_TIMESTAMP();

通过以上结果可以看出,my_orders表查询直接经过p0分区,只扫描了49386行,而my_order表没有进行分区,扫描了196983行,这也是性能得到提升的关键所在。

当然,表的分区并不是分的越多越好,当表的分区太多时找分区又是一个性能的瓶颈了,建议在200个分区以内。

LIST分区表创建方式:

/*****************创建分区表*********************/
CREATE TABLE `products` (
`id`  bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '表主键' ,
`name`  varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '产品名称' ,
`metrial`  tinyint UNSIGNED NOT NULL COMMENT '材质' ,
`weight`  double UNSIGNED NOT NULL DEFAULT 0 COMMENT '重量' ,
`vol`  double UNSIGNED NOT NULL DEFAULT 0 COMMENT '容积' ,
`c_id`  tinyint UNSIGNED NOT NULL COMMENT '供货公司ID' ,
PRIMARY KEY (`id`,`c_id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8/*********分区信息**************/
PARTITION BY LIST(c_id)
(PARTITION pA VALUES IN (1,3,11,13),PARTITION pB VALUES IN (2,4,12,14),PARTITION pC VALUES IN (5,7,15,17),PARTITION pD VALUES IN (6,8,16,18),PARTITION pE VALUES IN (9,10,19,20)
);

可以看出,LIST分区和RANGE分区很类似,这里就不做性能分析了,和RANGE很类似。

HASH分区表的创建方式:

/*****************分区表*****************/
CREATE TABLE `msgs` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '表主键',`sender` int(10) unsigned NOT NULL COMMENT '发送者ID',`reciver` int(10) unsigned NOT NULL COMMENT '接收者ID',`msg_type` tinyint(3) unsigned NOT NULL COMMENT '消息类型',`msg` varchar(225) NOT NULL COMMENT '消息内容',`atime` int(10) unsigned NOT NULL COMMENT '发送时间',`sub_id` tinyint(3) unsigned NOT NULL COMMENT '部门ID',PRIMARY KEY (`id`,`sub_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*********分区信息**************/
PARTITION BY HASH(sub_id)
PARTITIONS 10;

以上语句代表,msgs表按照sub_id进行HASH分区,一共分了十个区。

Key分区和HASH分区很类似,不再介绍,若想了解可以参考Mysql官方文档进行详细了解。

子分区的创建方式:

CREATE TABLE `msgss` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '表主键',`sender` int(10) unsigned NOT NULL COMMENT '发送者ID',`reciver` int(10) unsigned NOT NULL COMMENT '接收者ID',`msg_type` tinyint(3) unsigned NOT NULL COMMENT '消息类型',`msg` varchar(225) NOT NULL COMMENT '消息内容',`atime` int(10) unsigned NOT NULL COMMENT '发送时间',`sub_id` tinyint(3) unsigned NOT NULL COMMENT '部门ID',PRIMARY KEY (`id`,`atime`,`sub_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*********分区信息**************/
PARTITION BY RANGE (atime) SUBPARTITION BY HASH (sub_id)
(PARTITION t0 VALUES LESS THAN(1451577600)(SUBPARTITION s0,SUBPARTITION s1,SUBPARTITION s2,SUBPARTITION s3,SUBPARTITION s4,SUBPARTITION s5),PARTITION t1 VALUES LESS THAN(1483200000)(SUBPARTITION s6,SUBPARTITION s7,SUBPARTITION s8,SUBPARTITION s9,SUBPARTITION s10,SUBPARTITION s11),PARTITION t2 VALUES LESS THAN MAXVALUE(SUBPARTITION s12,SUBPARTITION s13,SUBPARTITION s14,SUBPARTITION s15,SUBPARTITION s16,SUBPARTITION s17)
);

检查子分区是否创建成功:

EXPLAIN PARTITIONS SELECT * FROM msgss;

结果如下图:

数据切分——Mysql分区表的建立及性能分析相关推荐

  1. 数据切分——Mysql分区表的管理与维护

    关于Mysql分区表的介绍可以参考: http://blog.csdn.net/jhq0113/article/details/44592865 关于Mysql分区表的创建可以参考: http://b ...

  2. 数据可视化 数据可视化看板项目一:(1)模拟实时数据 -使用MYSQL的事件建立动态模拟数据,每秒更新一次 (1)

    需求: 市场人员进行数据可视化产品销售公关时,一定会遇到一个问题,就是客户要求进行展示. 但是我们不可能透露其它客户目前的真实实时更新的数据. 那么这里就要求,创建模拟的秒级别的数据. 方法: 1.使 ...

  3. 由浅入深探究mysql索引结构原理_性能分析与优化_由浅入深探究mysql索引结构原理、性能分析与优化...

    由浅入深探究mysql索引结构原理.性能分析与优化 第一部分:基础知识第二部分:MYISAM和INNODB索引结构1, 简单介绍B-tree B+ tree树 2, MyisAM索引结构 3, Ann ...

  4. mysql工具使用意义_MySQL性能分析、及调优工具使用详解

    本文汇总了MySQL DBA日常工作中用到的些工具,方便初学者,也便于自己查阅. 先介绍下基础设施(CPU.IO.网络等)检查的工具: vmstat.sar(sysstat工具包).mpstat.op ...

  5. mysql索引结构原理、性能分析与优化

    摘要: 第一部分:基础知识 第二部分:MYISAM和INNODB索引结构 1.简单介绍B-tree B+ tree树 2.MyisAM索引结构 3.Annode索引结构 4.MyisAM索引与Inno ...

  6. [转]Mysql Join语法解析与性能分析

    转自:http://www.cnblogs.com/BeginMan/p/3754322.html 一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 ...

  7. 第41讲:MySQL内置的QL性能分析工具

    文章目录 1.SQL性能分析的概念 2.分析数据库中SQL的执行频率 3.数据库中的慢查询日志 3.1.开启慢查询日志功能 3.2.模拟慢SQL查询观察日志内容 4.Profile查看SQL每个阶段的 ...

  8. 数据切分——MySql表分区概述

    定义:        表的分区指根据可以设置为任意大小的规则,跨文件系统分配单个表的多个部分.实际上,表的不同部分在不同的位置被存储为单独的表.用户所选择的.实现数据分割的规则被称为分区函数,这在My ...

  9. mysql解释器优化_MySQL——SQL性能分析优化利器之Explain

    系统性能的优劣取决于我们sql的查询速度,MySQL Explain命令是分析SQL性能及优化不可缺少的一部分. Explain被我们称为解释器,通过 explain 我们可以知道以下信息:表的读取顺 ...

最新文章

  1. 黄家懿:河北高校邀请赛 -- 二手车交易价格预测决赛答辩
  2. Zeppelin源码
  3. mysql ignore index_mysql use index、ignore index、force index用法
  4. hivesql优化的深入解析
  5. c++ 结构体初始化_STM32入门系列-使用库函数点亮LED,LED初始化函数
  6. BIO,NIO,AIO
  7. 又一国产新机定价逆天!网友:千万不要作...
  8. GIF 太大?用 GIFSicle
  9. [SpringMVC]SpringMVC学习笔记一: springmvc原理及实例解析.
  10. 11月17日站立会议内容
  11. 蓝桥杯2019年第十届C/C++省赛A组第三题-最大降雨量
  12. 解决GetTickCount的问题
  13. 魅蓝note6救砖_魅蓝NOTE6救砖工具及线刷包
  14. pptx 批量操作幻灯片
  15. mysql报1032_MySQL SQL_ERROR 错误号 1032解决办法
  16. 图像去燥:NLM、BM3D
  17. 软件测试/测试开发丨Docker 容器技术与常用命令
  18. Python语言零基础入门教程(一)
  19. 我叫mt4最新服务器,我叫mt4什么时候开新区 开服时间表
  20. Flutter:如何响应触摸事件

热门文章

  1. dbforge连接mysql_DbForge Schema Compare for MySQL入门教程:如何连接到数据库
  2. 电脑的发展史_苹果都使用自研芯片了,你还记得你的第一台电脑吗?
  3. linux查看u盘的分区,在Linux下访问windows分区以及U盘
  4. ActiveMQ_Linux安装
  5. php 二维数组去除一项,PHP二维数组提取函数----把不需要的数据剔除
  6. 正式环境docker部署hyperf_HyperLedger/Fabric SDK使用Docker容器镜像快速部署上线
  7. mongodb 分组聚合_MongoDB学习笔记整理,赶紧收藏起来吧
  8. python 写csv scrapy_scrapy爬虫框架实例一,爬取自己博客
  9. 文字识别(三)--文字定位与切割
  10. 衡量失败检测算法的指标