mysql非整形列分区、多列分区.txt

转载 2012年03月31日 12:55:09
资料出处:http://www.diybl.com/course/7_databases/mysql/Mysqljs/20100710/412088.html
非整数列分区
任何使用过分区的人应该都遇到过不少问题,特别是面对非整数列分区时,MySQL 5.1只能处理整数列分区,如果你想在日期或字符串列上进行分区,你不得不使用函数对其进行转换。
MySQL 5.5中新增了两类分区方法,RANG和LIST分区法,同时在新的函数中增加了一个COLUMNS关键词。我们假设有这样一个表:
CREATE TABLE expenses (  
  expense_date DATE NOT NULL,  
  category VARCHAR(30),  
  amount DECIMAL (10,3)  
); 
如果你想使用MySQL 5.1中的分区类型,那你必须将类型转换成整数,需要使用一个额外的查找表,到了MySQL 5.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')  
); 
这样的分区语句除了更加易读外,对数据的组织和管理也非常清晰,上面的例子只对category列进行分区。
在MySQL 5.1中使用分区另一个让人头痛的问题是date类型(即日期列),你不能直接使用它们,必须使用YEAR或TO_DAYS转换这些列,如:
/* 在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) */ 
看上去非常糟糕,当然也有变通办法,但麻烦确实不少。使用YEAR或TO_DAYS定义一个分区的确让人费解,查询时不得不使用赤裸列,因为加了函数的查询不能识别分区。
但在MySQL 5.5中情况发生了很大的变化,现在在日期列上可以直接分区,并且方法也很简单。
/*在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) */ 
在这里,通过函数定义和通过列查询之间没有冲突,因为是按列定义的,我们在定义中插入的值是保留的。
多列分区
COLUMNS关键字现在允许字符串和日期列作为分区定义列,同时还允许使用多个列定义一个分区,你可能在官方文档中已经看到了一些例子,如: 
CREATE TABLE p1 (  
  a INT,  
  b INT,  
  c INT 
)  
PARTITION BY RANGE COLUMNS (a,b)  
(  
  PARTITION p01 VALUES LESS THAN (10,20),  
  PARTITION p02 VALUES LESS THAN (20,30),  
  PARTITION p03 VALUES LESS THAN (30,40),  
  PARTITION p04 VALUES LESS THAN (40,MAXVALUE),  
  PARTITION p05 VALUES LESS THAN (MAXVALUE,MAXVALUE)  
);  
 
CREATE TABLE p2 (  
  a INT,  
  b INT,  
  c INT 
)  
PARTITION BY RANGE COLUMNS (a,b)  
(  
  PARTITION p01 VALUES LESS THAN (10,10),  
  PARTITION p02 VALUES LESS THAN (10,20),  
  PARTITION p03 VALUES LESS THAN (10,30),  
  PARTITION p04 VALUES LESS THAN (10,MAXVALUE),  
  PARTITION p05 VALUES LESS THAN (MAXVALUE,MAXVALUE)  

同样还有PARTITION BY RANGE COLUMNS (a,b,c)等其它例子。由于我很长时间都在使用MySQL 5.1的分区,我对多列分区的含义不太了解,LESS THAN (10,10)是什么意思?如果下一个分区是LESS THAN (10,20)会发生什么?相反,如果是(20,30)又会如何?
所有这些问题都需要一个答案,在回答之前,他们需要更好地理解我们在做什么。
开始时可能有些混乱,当所有分区有一个不同范围的值时,实际上,它只是在表的一个列上进行了分区,但事实并非如此,在下面的例子中:
CREATE TABLE p1_single (  
  a INT,  
  b INT,  
  c INT 
)  
PARTITION BY RANGE COLUMNS (a)  
(  
  PARTITION p01 VALUES LESS THAN (10),  
  PARTITION p02 VALUES LESS THAN (20),  
  PARTITION p03 VALUES LESS THAN (30),  
  PARTITION p04 VALUES LESS THAN (40),  
  PARTITION p05 VALUES LESS THAN (MAXVALUE)  
); 

相关文章推荐

MySQL分区表--列范围分区

MySQL分区表–列范围分区列范围分区与范围分区类似,但是允许基于多个列值的分区。

mysql/sql多行 转 多列,行属性转列属性

经过一天的奋斗与努力,我发现我越来越佩服我自己了,真的是太NB了,请叫我大侠!多行转多列,废话不多说,开始正文:首先,参考了:http://www.cnblogs.com/kingthy/archiv...

正确理解Mysql的列索引和多列索引

Mysql数据库提供两种类型的索引,如果没正确设置,索引的利用效率会大打折扣并且完全不知问题所在。 [c-sharp] view plain copy ...

MySQL种字符串拆分(substring_index)并作为关联查询条件后多列展示

本文欢迎转载,转载请注明出处,谢谢~(作者:喝酒不骑马 Colton_Null) from CSDN最近的项目中有个需求。有关用户的地址信息是存在person_info_t表中的address字...

MySQL分区之RANGE分区

环境: mysql> select version()\G *************************** 1. row *************************** version...

Mysql --分区(3)range分区

3.分区类型RANGE分区按照range分区的表是利用取值范围将数据分成分区,区间要连续并且不能互相重叠,使用values less than操作符进行分区定义CREATE TABLE tnp ( ...
  • ashic
  • ashic
  • 2016-08-09 15:15
  • 317

Mysql --分区表(7)Key分区

Key分区按照Key进行分区非常类似于按照Hash进行分区,只不过Hash分区允许使用用户自定义的表达式,而Key分区不允许使用用户自定义的表达式,需要使用MySQL服务器提供的HASH函数;同时Ha...
  • ashic
  • ashic
  • 2016-08-09 21:45
  • 2076

mysql分区之range分区

随着互联网的发展,各方面的数据越来越多,从最近两年大数据越来越强的呼声中就可见一斑。 我们所做的项目虽算不上什么大项目,但是由于业务量的问题,数据也是相当的多。 数据一多,就很容易出现性能问题,而...

MySQL分区表--hash分区

MySQL分区表–hash分区哈希分区最主要的用法是用来保证数据的平均分布。使用范围分区和列表分区时必须显示地定义分区值或者值列表;但是使用哈希分区时,我们只需要对列值或者基于列值的表达式进行哈希运算...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)