分区如下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个分区,那么在做如下查询的时候,会从分区受益
select * from employees  where store_id=3;只会扫描分区pNorth。但并不是所有的查询都会指定分区的,比如:
select * from employees where fname ='admin';
这样的查询,即使在fname上建了索引,效率还是很低,因为要扫描所有的分区,200个。这是分区带来的负面影响。我的问题是,怎么样处理分区带来的副作用?

解决方案 »

  1.   

    这样试试:
    用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');
      

  2.   

    用1个字段(NID,INT)保存fname所在分区,按NID分区这个实现比较复杂,不光是有fname,其他任何字段都是有可能的呀。
      

  3.   

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

  4.   

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

  5.   

    手册里少个左括号
    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)
    );
      

  6.   

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

  7.   

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

  8.   


    这个200倍怎么来的?profiling出来的吗是去200个文件找,但是每个文件只有二百分之一原来大小吧
      

  9.   

    200个文件打开,不是要200次IN么?
    如果只有一个文件,那么1次IN就搞定了。