表数据量大的时候一般都考虑水平拆分,即所谓的sharding.不过mysql本身具有分区功能,可以实现一定程度

的水平切分.
mysql是具有MERGE这种引擎的,就是把一些结构相同的MyIASM表作为一个表使用,但是我觉得 MERGE不如partition实用,
因为MERGE会在所有的底层表上查询,而partition只在相应的分区上查询.
建立了两个表,分别为分区和未分区的,分区表按年进行分区.

Sql代码
  1. CREATE TABLE `20130117date_par` (
  2. `content` varchar(20) NOT NULL,
  3. `create_time` datetime NOT NULL,
  4. KEY `20130117date_idx_date` (`create_time`)
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8
  6. PARTITION BY RANGE (YEAR(create_time))
  7. (PARTITION p2009 VALUES LESS THAN (2010),
  8. PARTITION p2010 VALUES LESS THAN (2011),
  9. PARTITION p2011 VALUES LESS THAN (2012),
  10. PARTITION p2012 VALUES LESS THAN (2013),
  11. PARTITION p2013 VALUES LESS THAN (2014))
  12. CREATE TABLE `20130117date` (
  13. `content` varchar(20) NOT NULL,
  14. `create_time` datetime NOT NULL,
  15. KEY `20130117date_idx_date` (`create_time`)
  16. ) ENGINE=InnoDB

CREATE TABLE `20130117date_par` (`content` varchar(20) NOT NULL,`create_time` datetime NOT NULL,KEY `20130117date_idx_date` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE (YEAR(create_time))
(PARTITION p2009 VALUES LESS THAN (2010),PARTITION p2010 VALUES LESS THAN (2011),PARTITION p2011 VALUES LESS THAN (2012),PARTITION p2012 VALUES LESS THAN (2013),PARTITION p2013 VALUES LESS THAN (2014))CREATE TABLE `20130117date` (`content` varchar(20) NOT NULL,`create_time` datetime NOT NULL,KEY `20130117date_idx_date` (`create_time`)
) ENGINE=InnoDB

用sp向分区表和普通表各插入了90w条随机数据.
用mysqlslap进行下测试

不用分区表

Sql代码
  1. select SQL_NO_CACHE * from 20130117date
  2. where create_time BETWEEN '2013-01-01' and '2013-01-02';
  3. select SQL_NO_CACHE * from 20130117date
  4. where create_time BETWEEN '2012-12-25' and '2013-01-05';

select SQL_NO_CACHE * from 20130117date
where create_time BETWEEN '2013-01-01' and '2013-01-02';
select SQL_NO_CACHE * from 20130117date
where create_time BETWEEN '2012-12-25' and '2013-01-05';
引用

Benchmark
Average number of seconds to run all queries: 0.881 seconds
Minimum number of seconds to run all queries: 0.062 seconds
Maximum number of seconds to run all queries: 3.844 seconds
Number of clients running queries: 1
Average number of queries per client: 2
Benchmark
Average number of seconds to run all queries: 0.703 seconds
Minimum number of seconds to run all queries: 0.062 seconds
Maximum number of seconds to run all queries: 1.922 seconds
Number of clients running queries: 1
Average number of queries per client: 2
Benchmark
Average number of seconds to run all queries: 1.250 seconds
Minimum number of seconds to run all queries: 0.109 seconds
Maximum number of seconds to run all queries: 4.032 seconds
Number of clients running queries: 1
Average number of queries per client: 2

用分区表

Sql代码
  1. select SQL_NO_CACHE * from 20130117date_par
  2. where create_time BETWEEN '2013-01-01' and '2013-01-02';
  3. select SQL_NO_CACHE * from 20130117date_par
  4. where create_time BETWEEN '2012-12-25' and '2013-01-05';

select SQL_NO_CACHE * from 20130117date_par
where create_time BETWEEN '2013-01-01' and '2013-01-02';
select SQL_NO_CACHE * from 20130117date_par
where create_time BETWEEN '2012-12-25' and '2013-01-05';
引用

Benchmark
Average number of seconds to run all queries: 0.068 seconds
Minimum number of seconds to run all queries: 0.047 seconds
Maximum number of seconds to run all queries: 0.110 seconds
Number of clients running queries: 1
Average number of queries per client: 2
Benchmark
Average number of seconds to run all queries: 0.250 seconds
Minimum number of seconds to run all queries: 0.031 seconds
Maximum number of seconds to run all queries: 1.078 seconds
Number of clients running queries: 1
Average number of queries per client: 2
Benchmark
Average number of seconds to run all queries: 0.046 seconds
Minimum number of seconds to run all queries: 0.046 seconds
Maximum number of seconds to run all queries: 0.047 seconds
Number of clients running queries: 1
Average number of queries per client: 2

看来性能还是有一定的提升的.

执行

Sql代码
  1. explain PARTITIONS select * from 20130117date_par
  2. where create_time BETWEEN '2012-01-01' and '2012-01-02';

explain PARTITIONS select * from 20130117date_par
where create_time BETWEEN '2012-01-01' and '2012-01-02';

可以看出这个query只扫描了p2012这个分区.
而且分区表的好处在于维护比较方便.比如2009年的数据不需要了,分区表的方法为

Sql代码
  1. alter table 20130117date_par drop PARTITION p2009

alter table 20130117date_par drop PARTITION p2009

不到1s就行了
普通表为

Sql代码
  1. delete from 20130117date
  2. where create_time BETWEEN '2009-01-01' and '2010-01-01'

delete from 20130117date
where create_time BETWEEN '2009-01-01' and '2010-01-01'

用了10.25s左右

转载于:https://blog.51cto.com/daheyuan/1131719

mysql Partition(分区)初探相关推荐

  1. mysql in partition_MySQL Partition分区扫盲

    MySQL从5.1.3开始支持Partition,你可以使用如下命令来确认你的版本是否支持Partition: mysql> SHOW VARIABLES LIKE '%partition%'; ...

  2. mysql partition 语法_MySQL partition分区小结

    MySQL partition分区 分区概念 分区针对不同的数据库,具有不同的特性.在这里专门针对MySQL数据库而言.在MySQL数据库里,分区这个概念是从mysql 5.1才开始提供的.不过目前只 ...

  3. Mysql PARTITION 数据表分区技术日期

    参考:http://www.sunzhenghua.com/mysql-myisam-innodb-partition-range-list-hash 在这一章节里, 我们来了解下 Mysql 中的分 ...

  4. mysql的partition分区

    前言:当一个表里面存储的数据特别多的时候,比如单个.myd数据都已经达到10G了的话,必然导致读取的效率很低,这个时候我们可以采用把数据分到几张表里面来解决问题. 方式一:通过业务逻辑根据数据的大小通 ...

  5. maxvalue mysql自动分区_mysql的partition分区

    前言:当一个表里面存储的数据特别多的时候,比如单个.myd数据都已经达到10G了的话,必然导致读取的效率很低,这个时候我们可以采用把数据分到几张表里面来解决问题. 方式一:通过业务逻辑根据数据的大小通 ...

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

    MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测) 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过 ...

  7. mysql 分区表优化_Sql优化之Mysql表分区

    一  分区表适用于以下场景 1:表非常大以至于无法全部放在内存中,或者只在标的最后部分有热点数据,其他均是历史数据 2:分区表的数据更容易维护.例如想批量删除大量数据可以使用清除整个分区的方式.另外还 ...

  8. mysql创建分区是否存在_mysql中如何判断是否支持分区

    mysql可以通过下面语句判断是否支持分区: SHOW VARIABLES LIKE '%partition%'; 如果输出: have_partitioning   YES 表示支持分区. 或者通过 ...

  9. Mysql表分区的选择与实践小结

    2019独角兽企业重金招聘Python工程师标准>>> 在一些系统中有时某张表会出现百万或者千万的数据量,尽管其中使用了索引,查询速度也不一定会很快.这时候可能就需要通过分库,分表, ...

最新文章

  1. 报告 | 2017年云商业智能市场分析:云计算比大数据更重要
  2. 2016年中国数据安全五大发展趋势
  3. RocketMQ简介、环境搭建
  4. jquery插件之无缝循环新闻列表
  5. mysql子分区多少层_MySQL 子分区-阿里云开发者社区
  6. 【Linux】Linux中常用操作命令
  7. python暂停和恢复_python – 暂停和恢复QThread
  8. 力扣59.螺旋矩阵II(JavaScript)
  9. hdu 1162(最小生成树kruskal)
  10. windows8怎么关机_按下电源键后发生了什么?电脑是如何关机的?
  11. 计算机组成原理中EMAR是什么,计算机组成原理复习资料+试题
  12. 文达仓库管理软件 v5.32 网络版 怎么用
  13. python 结巴分词学习
  14. Python人脸识别库的安装
  15. 第四篇机器学习投资组合——模型测试
  16. 【系统分析师】操作系统
  17. 每个月5千的工资不想干了想转行测试,软件测试薪资待遇怎么样?
  18. 批量全景视频画面提取
  19. 个人博客系统【项目篇】
  20. STC89C52实现时钟功能

热门文章

  1. Memcached相关内容总结
  2. Vagrant+VirtualBox版本的坑
  3. springMVC解析视图
  4. [0] Tornado Todo 开篇
  5. ElasticSearch之动态映射和模板
  6. 获取当前iframe动态加载文档的href
  7. ----icon moon追加新字体图标----
  8. lombok不生效问题(持续补充)
  9. Ubuntu20.04下面运行applet与freemind部署到web上(调研+找到替换方案)
  10. flink批流统一​(还没完成)