mysql分区优化的一些坑

说明:

一下几种都是本人进过测试的都是向数据库中加入2000W数据,存储引擎InnoDB版本5.7主要对比几种开启分区,与未开启分区之间的优化【ps:如有不对的地方请大手不吝啬指教】
1.一个表最多只能有1024个分区
2.如果分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引列都必须包含进来
3.分区表无法使用外键约束
4.NULL值会使分区过滤无效
5.所有分区必须使用相同的存储引擎

分区的类型:

RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区

对于此分区我在测试的时候使用=、like、<、>等进行where条件测试对比下来感觉分区前后并没有太大的区分,这地方我也只使用某一分区

-- 创建表的时候同时将区域分好
CREATE TABLE part_tab (
c1 int default NULL,
c2 varchar(30) default NULL,
c3 date default NULL
) engine=INNODB
 PARTITION BY RANGE (year(c3) )
 ( PARTITION p0 VALUES LESS THAN (1995),
PARTITION p1 VALUES LESS THAN (1996) ,
PARTITION p2 VALUES LESS THAN (1997) ,
PARTITION p3 VALUES LESS THAN (1998) ,
PARTITION p4 VALUES LESS THAN (1999) ,
PARTITION p5 VALUES LESS THAN (2000) ,
PARTITION p6 VALUES LESS THAN (2001) ,
PARTITION p7 VALUES LESS THAN (2002) ,
PARTITION p8 VALUES LESS THAN (2003) ,
PARTITION p9 VALUES LESS THAN (2004) ,
PARTITION p10 VALUES LESS THAN (2010) ,
PARTITION p11 VALUES LESS THAN MAXVALUE ) ;

--使用储存函数进行数据模拟插入

CREATE PROCEDURE load_part_tab()
begin
declare v int default 0 ;
while v < 20000000
do
insert into part_tab
values (NULL,'testing partitions',adddate('1995-01-01',(rand(v)*36520) mod 3652)) ;
set v = v + 1 ;
end while ;
end

--调取对应的函数

call load_part_tab();

LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择

对于此分区,在测试的时候分完区查询速度明显提升当然这地方我只使用了某一分区无论之你用in、=之类的效率还是不错的

CREATE TABLE tblist1 (
    id INT NOT NULL,
    store_id INT
)
PARTITION BY LIST(store_id) (
    PARTITION a VALUES IN (0,1,5,6),
    PARTITION b VALUES IN (2,7,8),
    PARTITION c VALUES IN (3,9,10),
    PARTITION d VALUES IN (4,11,12)
);

HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式

对于此分区有一个奇怪的点,他的分区数据都不是连续性的,当然还是没啥效果,用了与没用都差别不大
在这里插入图片描述

CREATE TABLE emp2linehash(id INT NOT NULL,

                ename VARCHAR(20),
                          
				job VARCHAR(30) NOT NULL,

                store_id INT NOT NULL)

PARTITION BY LINEAR HASH (store_id) PARTITIONS 4;

猜你喜欢

转载自blog.csdn.net/cj181jie/article/details/108668421