请假一个表分区的问题

分区如下
SQL code

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 LIST(store_id)
    PARTITION pNorth VALUES IN (3,5,6,9,17),
    PARTITION pEast VALUES IN (1,2,10,11,19,20),
    PARTITION pWest VALUES IN (4,12,13,14,18),
    PARTITION pCentral VALUES IN (7,8,15,16)
);



这个是参考手册里的例子
现在只有4个分区,比如我的业务需要有200个分区,那么在做如下查询的时候,会从分区受益
SQL code
select * from employees  where store_id=3;


只会扫描分区pNorth。

但并不是所有的查询都会指定分区的,比如:
SQL code
select * from employees where fname ='admin';

这样的查询,即使在fname上建了索引,效率还是很低,因为要扫描所有的分区,200个。这是分区带来的负面影响。

我的问题是,怎么样处理分区带来的副作用?

作者: zuoxingyu   发布时间: 2011-05-17

这样试试:
用1个字段(NID,INT)保存fname所在分区,按NID分区
比如 admin1 在1分区
  admin2 在2分区
  admin3 在3分区

select nid from tt where fname ='admin';

select * from tt where nid=(select DISTINCT nid from employees where fname ='admin');

作者: wwwwb   发布时间: 2011-05-17

用1个字段(NID,INT)保存fname所在分区,按NID分区

这个实现比较复杂,不光是有fname,其他任何字段都是有可能的呀。

作者: zuoxingyu   发布时间: 2011-05-17

维护这个字段也比较难,在APP层或者触发器,都不是个简单的工作。

作者: zuoxingyu   发布时间: 2011-05-17

200个分区,还是分表吧,从程序上控制逻辑,还可以降低表坏的风险。

作者: vipper23   发布时间: 2011-05-17

引用 4 楼 vipper23 的回复:

200个分区,还是分表吧,从程序上控制逻辑,还可以降低表坏的风险。

分表也解决不了这个问题呀。

比如按store_id进行分表,分成200个表了。在查询的时候,如果是查询所有用户名称=张三的,那么就有200个UNION了。效率应该更差。

作者: zuoxingyu   发布时间: 2011-05-17

手册里少个左括号
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 LIST(store_id) (
  PARTITION pNorth VALUES IN (3,5,6,9,17),
  PARTITION pEast VALUES IN (1,2,10,11,19,20),
  PARTITION pWest VALUES IN (4,12,13,14,18),
  PARTITION pCentral VALUES IN (7,8,15,16)
);

作者: rucypli   发布时间: 2011-05-17

副作用?

这比不分区的时候消耗还大吗,只能说在fname列查询的话分区是并不能带来好处的吧

作者: rucypli   发布时间: 2011-05-17

引用 5 楼 zuoxingyu 的回复:
引用 4 楼 vipper23 的回复:

200个分区,还是分表吧,从程序上控制逻辑,还可以降低表坏的风险。

分表也解决不了这个问题呀。

比如按store_id进行分表,分成200个表了。在查询的时候,如果是查询所有用户名称=张三的,那么就有200个UNION了。效率应该更差。

要确定 用户名称=张三 在哪个分区中,比如在3,2,4中
select * from employees where store_id in(3,2,4);
这样是否会快一些

作者: wwwwb   发布时间: 2011-05-17