请假一个表分区的问题
分区如下
SQL code
这个是参考手册里的例子
现在只有4个分区,比如我的业务需要有200个分区,那么在做如下查询的时候,会从分区受益
SQL code
只会扫描分区pNorth。
但并不是所有的查询都会指定分区的,比如:
SQL code
这样的查询,即使在fname上建了索引,效率还是很低,因为要扫描所有的分区,200个。这是分区带来的负面影响。
我的问题是,怎么样处理分区带来的副作用?
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');
用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,其他任何字段都是有可能的呀。
这个实现比较复杂,不光是有fname,其他任何字段都是有可能的呀。
作者: zuoxingyu 发布时间: 2011-05-17
维护这个字段也比较难,在APP层或者触发器,都不是个简单的工作。
作者: zuoxingyu 发布时间: 2011-05-17
200个分区,还是分表吧,从程序上控制逻辑,还可以降低表坏的风险。
作者: vipper23 发布时间: 2011-05-17
引用 4 楼 vipper23 的回复:
200个分区,还是分表吧,从程序上控制逻辑,还可以降低表坏的风险。
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)
);
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列查询的话分区是并不能带来好处的吧
这比不分区的时候消耗还大吗,只能说在fname列查询的话分区是并不能带来好处的吧
作者: rucypli 发布时间: 2011-05-17
引用 5 楼 zuoxingyu 的回复:
引用 4 楼 vipper23 的回复:
200个分区,还是分表吧,从程序上控制逻辑,还可以降低表坏的风险。
分表也解决不了这个问题呀。
比如按store_id进行分表,分成200个表了。在查询的时候,如果是查询所有用户名称=张三的,那么就有200个UNION了。效率应该更差。
引用 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