表数据量大的时候一般都考虑水平拆分,即所谓的sharding.不过mysql本身具有分区功能,可以实现一定程度 的水平切分.
mysql是具有MERGE这种引擎的,就是把一些结构相同的MyIASM表作为一个表使用,但是我觉得 MERGE不如partition实用,
www.2cto.com
因为MERGE会在所有的底层表上查询,而partition只在相应的分区上查询.
建立了两个表,分别为分区和未分区的,分区表按年进行分区.
Sql代码
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代码
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代码
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
www.2cto.com
看来性能还是有一定的提升的.
执行
Sql代码
explain PARTITIONS select * from 20130117date_par
where create_time BETWEEN '2012-01-01' and '2012-01-02';
可以看出这个query只扫描了p2012这个分区.
而且分区表的好处在于维护比较方便.比如2009年的数据不需要了,分区表的方法为
Sql代码
alter table 20130117date_par drop PARTITION p2009
不到1s就行了
普通表为
Sql代码
delete from 20130117date
where create_time BETWEEN '2009-01-01' and '2010-01-01'
用了10.25s左右
- MySQL partition分区I
http://blog.csdn.net/binger819623/article/details/5280267 一. 分区的概念二. 为什么使用分区?(优点)三. ...
- MYSQL之水平分区----MySQL partition分区I(5.1)
一. 分区的概念 二. 为什么使用分区?(优点) 三. 分区类型 四. 子分区 五. 对分区进行修改(增加.删除.分解.合并) 六 ...
- MySQL PARTITION 分区
MySQL HASH分区 http://www.cnblogs.com/chenmh/p/5644496.html RANGE分区:http://www.cnblogs.com/chenmh/p/56 ...
- MySQL Partition分区扫盲
MySQL从5..3开始支持Partition,你可以使用如下命令来确认你的版本是否支持Partition: mysql> SHOW VARIABLES LIKE '%partition%'; ...
- mysql partition分区
(转) 自5.1开始对分区(Partition)有支持 = 水平分区(根据列属性按行分)=举个简单例子:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录. === 水 ...
- mysql的partition分区
前言:当一个表里面存储的数据特别多的时候,比如单个.myd数据都已经达到10G了的话,必然导致读取的效率很低,这个时候我们可以采用把数据分到几张表里面来解决问题.方式一:通过业务逻辑根据数据的大小通过 ...
- mysql表分区 partition
表分区 partition 当一张表的数据非常多的时候,比如单个.myd文件都达到10G, 这时,必然读取起来效率降低. 可不可以把表的数据分开在几张表上? 1: 从业务角度可以解决.. (分表,水平 ...
- mysql的分区和分表
分区 分区就是把一个数据表的文件和索引分散存储在不同的物理文件中. mysql支持的分区类型包括Range.List.Hash.Key,其中Range比较常用: RANGE分区:基于属于一个给定连续区 ...
- MySQL表分区技术
MySQL表分区技术 MySQL有4种分区类型: 1.RANGE 分区 - 连续区间的分区 - 基于属于一个给定连续区间的列值,把多行分配给分区: 2.LIST 分区 - 离散区间的分区 - 类似于按 ...
随机推荐
- Eclipse启动Tomcat访问不了首页
Eclipse开发web项目与myEclipse不同: 启动服务器后访问 http:localhost:8080 找不到服务器 想要访问Tomcat首页只需修改Tomcat配置 进入Eclipse双击 ...
- jpGraph的应用及基本安装配置 BY 命运
1.---jpGraph其实就是一个图表类库,会让开发者们作图非常方便,只要几行代码就可以勾画出非常炫的图表. 官方下载地址是:http://jpgraph.net/download/ jpGra ...
- Oracle中用一张表的字段更新另一张表的字段
今天在做项目的过程中,发现开发库中某张表的某字段有许多值是空的,而测试库中该字段的值则是有的. 那么,有什么办法能将测试库中该字段的值更新到开发库中呢? SQL Server中这是比较容易解决的,而O ...
- iOS开发——音频篇——音效的播放
一.简单介绍 简单来说,音频可以分为2种 (1)音效 又称“短音频”,通常在程序中的播放时长为1~2秒 在应用程序中起到点缀效果,提升整体用户体验 (2)音乐 比如游戏中的“背景音乐”,一般播放时间较 ...
- Runtime运行时学习(一)
其实Runtime已经开源: 下载objc4-437.1.tar.gz来看看源码: 参考: http://blog.cocoabit.com/2014-10-06-yi-li-jie-objctive ...
- CDT 错误 Cannot run program "gcc"
Eclipse+CDT 编辑C/C++程序出错误: 出现编译错误: **** Rebuild of configuration Debug for project example **** **** ...
- map容器对象插入数据的4种方式
#include <string> #include <iostream> #include <map> #include <utility> u ...
- SGU 239.Minesweeper
题意: 如图,一列未知的区域长度为n(≤1000),给出第二列的数字,求区域中雷的排列有多少种. Solution: 搜索.这题看上去1000的范围很大,实际上加上合理的剪枝,状态数会变得非常非常少. ...
- ellang 中进程异步通信中的信箱与保序
erlang 进程通讯中 执行到 receive 语句时 如果信箱没有消息可以匹配时会暂停等待消息. go() -> register(echo, spawn(test_pid,loop,[]) ...
- JS将时间戳转换为JS Date类型
/*将JSON Date 格式转换为JavaScript 的Date 类型JSON Date 格式:"/Date(146471041000)/"*/function JSONDat ...