在线表有一个超过30万,这个表使用得相当频繁。已经有2007 2008 2009 2010 4 年的数据了。
a(id, name,bdata, createDate)
按照createDate这个进去分区。我记得sqlsever oracle 都有sql可以直接取某个分区的sql 
SELECT *, $PARTITION.YEARPF(DUEDATE) FROM PARTITIONEDORDERS   (sqlserver 有这个)
1  如何根据createDate这个进去分区。
2  如何写查制定分区的sql
比如 查 2010年某个name=‘aaa’的记录,不用全表进行查找 。 已经知道只差当年的用户。
参考:
CREATE TABLE employees (
    ->     id INT NOT NULL,
    ->     fname VARCHAR(30),
    ->     lname VARCHAR(30),
    ->     hired DATE NOT NULL DEFAULT '1970-01-01',
    ->     separated DATE NOT NULL DEFAULT '9999-12-31',
    ->     job_code INT,
    ->     store_id INT
    -> )
    -> PARTITION BY RANGE ( YEAR(separated)*100+MONTH(separated) ) (
    ->     PARTITION p0 VALUES LESS THAN (201001),
    ->     PARTITION p1 VALUES LESS THAN (201002),
    ->     PARTITION p2 VALUES LESS THAN (201003),
    ->     PARTITION p3 VALUES LESS THAN MAXVALUE
    -> );

解决方案 »

  1.   

    MYSQL中不能直接指定分区,由MYSQL自行控制。
      

  2.   


    mysql> explain partitions select * from terminal_parameter where createtime between '2010-04-01' and '2010-04-15';
    +----+-------------+--------------------+------------+-------+----------------+----------------+---------+------+------+-------------+
    | id | select_type | table              | partitions | type  | possible_keys  | key            | key_len | ref  | rows | Extra       |
    +----+-------------+--------------------+------------+-------+----------------+----------------+---------+------+------+-------------+
    |  1 | SIMPLE      | terminal_parameter | p0,p1      | range | idx_createtime | idx_createtime | 8       | NULL |    2 | Using where |
    +----+-------------+--------------------+------------+-------+----------------+----------------+---------+------+------+-------------+
    1 row in set (0.05 sec)如上,MYSQL并不能指定在哪个分区去查,但是可以EXPLAIN出,它具体到哪几个分区查数据。怎么选择的,由MYSQL自行判断。我们无法控制。
      

  3.   

    MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
      

  4.   

    你的where条件加个时间 自然就制定到特定分区了
      

  5.   

    MySQL数据库分区的优点表现
    http://database.51cto.com  2010-05-11 18:23  佚名  博客园  我要评论(0)    * 摘要:以下的文章主要介绍的是MySQL数据库分区中的优点,以及MySQL数据库分区主要2种形式的描述,以下的文章会给你提供更全面的知识。
        * 标签:MySQL数据库分区
        *
          Oracle帮您准确洞察各个物流环节我们大家都知道MySQL数据库分区属于一种物理的数据库相关设计技术,DBA与MySQL数据库相关人员对其可以说是相当的熟悉。虽然实现分区技术有很多种,但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。分区主要有两种形式:这里一定要注意行和列的概念(row是行,column是列)1. 水平分区(Horizontal Partitioning)这种形式分区是对表的行进行MySQL数据库分区,通过这样的方式不同分组里面的物理列分割的数据集得以组合,从而进行个体分割(单分区)或集体分割(1个或多个分区)。所有在表中定义的列在每个数据集中都能找到,所以表的特性依然得以保持。举个简单例子:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录。(朋奕注:这里具体使用的分区方式我们后面再说,可以先说一点,一定要通过某个属性列来分割,譬如这里使用的列就是年份)2. 垂直分区(Vertical Partitioning) 这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度,使某些特定的列 被划分到特定的分区,每个分区都包含了其中的列所对应的行。举个简单例子:一个包含了大text和BLOB列的表,这些text和BLOB列又不经常被访问,这时候就要把这些不经常使用的text和BLOB了划分到另一个分区,在保证它们数据相关性的同时还能提高访问速度。在数据库供应商开始在他们的数据库引擎中建立MySQL数据库分区(主要是水平分区)时,DBA和建模者必须设计好表的物理分区结构,不要保存冗余的数据(不同表中同时都包含父表中的数据)或相互联结成一个逻辑父对象(通常是视图)。这种做法会使水平分区的大部分功能失效,有时候也会对垂直分区产生影响分区的一些优点包括:与单个磁盘或文件系统分区相比,可以存储更多的数据。对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的分区,很容易地删除那些数据。相反地,在某些情况下,添加新数据的过程又可以通过为那些新数据专门增加一个新的分区,来很方便地实现。通常和分区有关的其他优点包括下面列出的这些。MySQL数据库分区中的这些功能目前还没有实现,但是在我们的优先级列表中,具有高的优先级;我们希望在5.1的生产版本中,能包括这些功能。一些查询可以得到极大的优化,这主要是借助于满足一个给定WHERE 语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区。因为分区可以在创建了分区表后进行修改,所以在第一次配置分区方案时还不曾这么做时,可以重新组织数据,来提高那些常用查询的效率。涉及到例如SUM() 和 COUNT()这样聚合函数的查询,可以很容易地进行并行处理。这种查询的一个简单例子如 “SELECT salesperson_id, COUNT(orders) as order_total FROM sales GROUP BY salesperson_id;”。通过“并行”,这意味着该查询可以在每个MySQL数据库分区上同时进行,最终结果只需通过总计所有分区得到的结果。通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。
    http://database.51cto.com/art/201005/199332.htm
      

  6.   

    如果是Postgresql呢,如何按照两个或以上条件聚合