`

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
分享到:
评论

相关推荐

    mysql 5.5版本的驱动

    MySQL 5.5版本的驱动是Java应用程序与MySQL数据库交互的关键组件,主要通过JDBC(Java Database Connectivity)接口实现。JDBC是Java平台上的标准,它允许Java开发者使用SQL语句来访问和处理数据库。MySQL的JDBC驱动...

    MySQL5.5绿色版(免安装)

    同时,MySQL5.5还改进了查询优化器,使得SQL语句能够被更高效地解析和执行,加快了数据查询的速度。 此外,对于开发者而言,MySQL5.5版本在功能上的增强不可忽视。它增加了对存储过程、触发器和视图的支持,这使得...

    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 软件堆栈具有重要意义,而且在功能和性能上也实现了显著的提升...

    mysql5.5 for windows

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

    MySQL 5.5 Reference Manual

    - **分区支持**:MySQL 5.5 提供了更强大的分区功能,允许将表数据分割到不同的物理磁盘上,从而提高查询性能和管理效率。 ### 管理与开发指南 - **安装与升级**:提供了详细的安装步骤和注意事项,包括不同操作...

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

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

    java连接mysql5.5的jar包

    java连接mysql5.5的jar包 mysql-connector-java-5.1.35-bin.jar

    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官方版

    MySQL5.5是MySQL数据库管理系统的一个重要版本,它在MySQL的演化历程中占据了显著的地位,提供了许多增强特性和性能优化。MySQL是一个开源的关系型数据库管理系统(RDBMS),基于SQL语言,广泛应用于互联网上的中...

Global site tag (gtag.js) - Google Analytics