`

Mysql 5.5分区特性增强深度解析

 
阅读更多

 

 

 原文链接:http://www.javaarch.net/jiagoushi/552.htm

 

Mysql 5.5分区特性增强深度解析

1.最直观的部分,用非整数列分区 partition by non-integer columns,mysql5.1只支持基于整数列的分区,如果你要用日期 date或者字符串 string,那么你自己需要写一个函数做转换。

比如我们看下面一个table:

	CREATE TABLE expenses (
	  expense_date DATE NOT NULL,
	  category VARCHAR(30),
	  amount DECIMAL (10,3)
	);

如果在mysql5.1中,你想用category列来作为分区列,那么你要把category转为整数。但是在mysql5.5版本中,你可以直接用下面的方式来处理分区问题

	ALTER TABLE expenses
	PARTITION BY LIST COLUMNS (category)
	(
	  PARTITION p01 VALUES IN ( 'lodging', 'food'),
	  PARTITION p02 VALUES IN ( 'flights', 'ground transportation'),
	  PARTITION p03 VALUES IN ( 'leisure', 'customer entertainment'),
	  PARTITION p04 VALUES IN ( 'communications'),
	  PARTITION p05 VALUES IN ( 'fees')
	);
	
mysql5.1中是怎么处理date类型的分区呢,你可以直接使用这些date的列,但是你必须把这些column转为YEAR或TO_DAYS

	/* with MySQL 5.1*/
	CREATE TABLE t2
	(
	  dt DATE
	)
	PARTITION BY RANGE (TO_DAYS(dt))
	(
	  PARTITION p01 VALUES LESS THAN (TO_DAYS('2007-01-01')),
	  PARTITION p02 VALUES LESS THAN (TO_DAYS('2008-01-01')),
	  PARTITION p03 VALUES LESS THAN (TO_DAYS('2009-01-01')),
	  PARTITION p04 VALUES LESS THAN (MAXVALUE));

	SHOW CREATE TABLE t2 \G
	*************************** 1. row ***************************
		   Table: t2
	Create Table: CREATE TABLE `t2` (
	  `dt` date DEFAULT NULL
	) ENGINE=MyISAM DEFAULT CHARSET=latin1
	/*!50100 PARTITION BY RANGE (TO_DAYS(dt))
	(PARTITION p01 VALUES LESS THAN (733042) ENGINE = MyISAM,
	 PARTITION p02 VALUES LESS THAN (733407) ENGINE = MyISAM,
	 PARTITION p03 VALUES LESS THAN (733773) ENGINE = MyISAM,
	 PARTITION p04 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) */
	 
但是要是查询如果不用函数转换下那么就无法利用分区特性来提高性能。

我们看看mysql5.5的写法:

	/*With MySQL 5.5*/
	CREATE TABLE t2
	(
	  dt DATE
	)
	PARTITION BY RANGE COLUMNS (dt)
	(
	  PARTITION p01 VALUES LESS THAN ('2007-01-01'),
	  PARTITION p02 VALUES LESS THAN ('2008-01-01'),
	  PARTITION p03 VALUES LESS THAN ('2009-01-01'),
	  PARTITION p04 VALUES LESS THAN (MAXVALUE));

	SHOW CREATE TABLE t2 \G
	*************************** 1. row ***************************
		   Table: t2
	Create Table: CREATE TABLE `t2` (
	  `dt` date DEFAULT NULL
	) ENGINE=MyISAM DEFAULT CHARSET=latin1
	/*!50500 PARTITION BY RANGE  COLUMNS(dt)
	(PARTITION p01 VALUES LESS THAN ('2007-01-01') ENGINE = MyISAM,
	 PARTITION p02 VALUES LESS THAN ('2008-01-01') ENGINE = MyISAM,
	 PARTITION p03 VALUES LESS THAN ('2009-01-01') ENGINE = MyISAM,
	 PARTITION p04 VALUES LESS THAN (MAXVALUE) ENGINE = MyISAM) */
	 
支持多列的分区

	CREATE TABLE employees (
	  emp_no int(11) NOT NULL,
	  birth_date date NOT NULL,
	  first_name varchar(14) NOT NULL,
	  last_name varchar(16) NOT NULL,
	  gender char(1) DEFAULT NULL,
	  hire_date date NOT NULL
	) ENGINE=MyISAM
	PARTITION BY RANGE  COLUMNS(gender,hire_date)
	(PARTITION p01 VALUES LESS THAN ('F','1990-01-01') ,
	 PARTITION p02 VALUES LESS THAN ('F','2000-01-01') ,
	 PARTITION p03 VALUES LESS THAN ('F',MAXVALUE) ,
	 PARTITION p04 VALUES LESS THAN ('M','1990-01-01') ,
	 PARTITION p05 VALUES LESS THAN ('M','2000-01-01') ,
	 PARTITION p06 VALUES LESS THAN ('M',MAXVALUE) ,
	 PARTITION p07 VALUES LESS THAN (MAXVALUE,MAXVALUE)
	 
那么我们下面的查询就能利用分区的特性:
 
	 select count(*) from employees where gender='F' and hire_date < '1990-01-01';
	+----------+
	| count(*) |
	+----------+
	|    66212 |
	+----------+
	1 row in set (0.05 sec)

	explain partitions select count(*) from employees where gender='F' and hire_date < '1990-01-01'\G
	*************************** 1. row ***************************
			   id: 1
	  select_type: SIMPLE
			table: employees
	   partitions: p01
			 type: ALL
	possible_keys: NULL
			  key: NULL
		  key_len: NULL
			  ref: NULL
			 rows: 300024
			Extra: Using where
			
	select count(*) from employees where gender='F';
	+----------+
	| count(*) |
	+----------+
	|   120051 |
	+----------+
	1 row in set (0.12 sec)

	explain partitions select count(*) from employees where gender='F'\G
	*************************** 1. row ***************************
			   id: 1
	  select_type: SIMPLE
			table: employees
	   partitions: p01,p02,p03,p04
			 type: ALL
	possible_keys: NULL
			  key: NULL
		  key_len: NULL
			  ref: NULL
			 rows: 300024
			Extra: Using where
			
但是如果用第二列的话,那么只能全盘扫描。

	select count(*) from employees where hire_date < '1990-01-01';
	+----------+
	| count(*) |
	+----------+
	|   164797 |
	+----------+
	1 row in set (0.18 sec)

	explain partitions select count(*) from employees where hire_date < '1990-01-01'\G
	*************************** 1. row ***************************
			   id: 1
	  select_type: SIMPLE
			table: employees
	   partitions: p01,p02,p03,p04,p05,p06,p07
			 type: ALL
	possible_keys: NULL
			  key: NULL
		  key_len: NULL
			  ref: NULL
			 rows: 300024
			Extra: Using where
			
截断分区:在5.1中我们可以使用DELETE或者 DROP PARTITION来删除过期的分区,5.5中使用TRUNCATE PARTITION来保留分区数,多余的删除掉。


5.5中我们可以使用TO_SECONDS来把日期转成秒,从第0年开始,以此来细分分区

	CREATE TABLE t2 (
	  dt datetime
	)
	PARTITION BY RANGE (to_seconds(dt))
	(
	  PARTITION p01 VALUES LESS THAN (to_seconds('2009-11-30 08:00:00')) ,
	  PARTITION p02 VALUES LESS THAN (to_seconds('2009-11-30 16:00:00')) ,
	  PARTITION p03 VALUES LESS THAN (to_seconds('2009-12-01 00:00:00')) ,
	  PARTITION p04 VALUES LESS THAN (to_seconds('2009-12-01 08:00:00')) ,
	  PARTITION p05 VALUES LESS THAN (to_seconds('2009-12-01 16:00:00')) ,
	  PARTITION p06 VALUES LESS THAN (MAXVALUE)
	);
	show create table t2\G
	*************************** 1. row ***************************
		   Table: t2
	Create Table: CREATE TABLE `t2` (
	  `dt` datetime DEFAULT NULL
	) ENGINE=MyISAM DEFAULT CHARSET=latin1
	/*!50500 PARTITION BY RANGE (to_seconds(dt))
	(PARTITION p01 VALUES LESS THAN (63426787200) ENGINE = MyISAM,
	 PARTITION p02 VALUES LESS THAN (63426816000) ENGINE = MyISAM,
	 PARTITION p03 VALUES LESS THAN (63426844800) ENGINE = MyISAM,
	 PARTITION p04 VALUES LESS THAN (63426873600) ENGINE = MyISAM,
	 PARTITION p05 VALUES LESS THAN (63426902400) ENGINE = MyISAM,
	 PARTITION p06 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) *
	 
原文:http://dev.mysql.com/tech-resources/articles/mysql_55_partitioning.html

 

  

0
5
分享到:
评论

相关推荐

    MySQL5.5绿色版(免安装)

    其免安装特性、haosql控制面板的便利性以及MySQL5.5版本的稳定性和性能,共同构建了一个强大而又易于管理的数据库环境。用户只需要按照“HaoSQL使用说明.txt”中的指示进行操作,就能快速上手并充分利用这个工具。

    MySQL5.5.zip_mySql chm_mysql 5.5_mysql 中文_mysql5.5_mysql5.5.chm

    MySQL 5.5是MySQL数据库管理系统的一个重要版本,它提供了许多增强的功能和性能优化,使得这个开源数据库系统更适合大规模的企业级应用。这份"MySQL5.5.zip"压缩包包含了一个名为"mysql 5.5 chm 中文手册"的文件,这...

    mysql5.5安装包、图形化界面

    MySQL 5.5是MySQL数据库管理系统的一个重要版本,它提供了许多增强的功能和性能优化,使得这个版本成为当时很多企业和开发者的首选。在这个压缩包中,包含的是MySQL 5.5的Windows 32位安装程序以及一个图形化界面...

    MySQL5.5中文版

    1. **InnoDB存储引擎增强**:在MySQL5.5中,InnoDB成为了默认的存储引擎,提供了事务处理、行级锁定以及外键支持,适合大型并发应用程序。此版本对InnoDB进行了优化,提高了性能和并发能力。 2. **性能提升**:MySQL...

    MySQL安装文件MySQL5.5.zip

    3. **分区表**:MySQL 5.5支持更多类型的分区策略,如线性键值和范围分区,这有助于管理和优化大型表的性能。 4. **并行复制**:MySQL 5.5引入了半同步复制,确保数据在主从复制中的可靠性,防止数据丢失。此外,...

    MySql5.5 安装包 以及安装图解

    MySQL 5.5 版本引入了一些性能优化特性,例如 InnoDB 存储引擎的改进,支持更多的并行查询,更高效的查询缓存,以及对分区表的支持等。这些都使得 MySQL 5.5 在处理大数据量时表现更佳。 6. **安全性**: 安装...

    MySQL 5.5 新特性介绍和性能评估

    ### MySQL 5.5 新特性介绍与性能评估 #### 概述 MySQL 5.5 作为 Oracle 接管 MySQL AB 后发布的第一个重要版本,不仅对于 Oracle 自身的 LAMP / WAMP 软件堆栈具有重要意义,而且在功能和性能上也实现了显著的提升...

    mysql 5.5.tar.gz linux版mysql5.55下载

    MySQL 5.5是MySQL数据库管理系统的一个重要版本,它在2010年发布,带来了许多性能提升和新特性。`.tar.gz`是Linux和Unix系统中常用的文件压缩格式,用于将多个文件打包成一个单一的压缩文件,方便存储和传输。在本...

    mysql5.5 for windows

    3. **分区表**:在MySQL 5.5中,分区表功能得到了增强,支持更多类型的分区策略,如线性哈希分区和范围分区,这有助于大数据量的管理和查询性能提升。 4. **并发性能提升**:通过改进线程池和多线程调度,MySQL 5.5...

    MYSQL5.5英文手册,MYSQL5.5手册

    MYSQL5.5英文手册,MYSQL5.5手册,MYSQL英文手册,MYSQL手册

    MySQL5.5.zip

    MySQL5.5是MySQL数据库系统的一个重要版本,它在2010年发布,提供了许多增强功能和性能改进。MySQL是一种流行的开源关系型数据库管理系统(RDBMS),广泛应用于Web应用、数据存储和数据分析等领域。以下是对MySQL5.5...

    mysql5.5--64位 下载安装

    2. 支持更大的表:通过增加最大行长度和分区数量,MySQL 5.5能够处理更大的数据集。 3. 全新的InnoDB Plugin:提供了更好的崩溃恢复和事务处理能力。 4. 提升的查询性能:支持窗口函数,改进了索引合并优化器,...

    MySQL5.5的安装包

    MySQL 5.5是MySQL数据库管理系统的一个重要版本,它在2010年发布,带来了许多性能提升和功能增强。这个一键安装包旨在简化安装过程,让用户能够快速、简便地在计算机上设置MySQL服务器。 首先,MySQL 5.5引入了...

    MySQL 5.5+图形界面工具

    1. **MySQL 5.5 的特性**: - **InnoDB 引擎优化**:MySQL 5.5 强化了 InnoDB 存储引擎,支持全文搜索,提高了事务处理能力和并发性能。 - **更好的性能**:引入了并行复制,增强了查询性能,特别是对于复杂查询和...

    mysql5.5安装包 Windows (x86, 64-bit)

    MySQL 5.5引入了若干重要的新特性,包括: 1. **InnoDB存储引擎的改进**:提升了InnoDB的性能和可用性,支持更多事务隔离级别,实现了表空间压缩,提高了并发处理能力。 2. **分区功能增强**:支持更多的分区类型...

    MySQL5.5精简版.zip

    3. **分区功能**:MySQL5.5扩展了分区功能,允许用户在更大规模的数据上进行操作。分区可以提高查询性能,尤其在处理大数据集时。 4. **并行复制**:虽然MySQL5.5的复制功能没有达到后来版本的多线程复制,但它已经...

    mysql5.5免安装版

    MySQL 5.5是MySQL数据库管理系统的一个重要版本,它提供了许多增强的功能和性能优化,尤其对于企业级应用来说,这是一个非常受欢迎的选择。由于是“免安装版”,这意味着它不需要通过传统安装过程即可在操作系统上...

    mysql5.5免安装.rar

    MySQL 5.5是MySQL数据库管理系统的一个重要版本,它在2010年发布,带来了许多性能提升和新特性。这个“mysql5.5免安装.rar”文件是一个绿色免安装版的MySQL 5.5.22,适用于那些希望快速部署数据库而不想经历传统安装...

    mysql5.5安装软件

    MySQL 5.5是MySQL数据库管理系统的一个重要版本,它在2010年发布,带来了许多性能提升和新特性。MySQL是一种开源、免费的关系型数据库管理系统(RDBMS),广泛应用于网页应用程序、企业级系统以及大数据处理等领域。...

    MySQL5.5特性测试报告

    MySQL5.5特性测试报告 MySQL5.5特性测试报告 MySQL5.5特性测试报告

Global site tag (gtag.js) - Google Analytics