1.当数据量特别大的时候,仅仅是做索引,是不够的。这时就需要“分区” ,什么是分区 ?
a.将数据分段划分在多个位置存放,可以是同一块磁盘,也可以在不同的机器。
b.分区后,表还是一张表,但数据散列到多个位置了。
c.读写时,表名不变,数据库自动去组织分区的数据。
2.分区类型
mysql 中的分区有range,list,hash ,key 四种分区方法,其中最常用的是range,list这两种。
本篇文章使用range分区,比如,按照ID分区。
3.对已有的表进行分区(range模式)
alter table 表名 partition by range(字段名)(
partition 分区名 values less than (字段值)
)
4.使用例子测试
alter table news_main PARTITION by range(id) #使用range类型分区,并通过ID做为分区范围
(
PARTITION news_main_a values less than (2), #id小于或等于2,在news_main_a分区
PARTITION news_main_b values less than (6),
PARTITION news_main_c values less than (MAXVALUE) #id小于或等于id的最大值,在news_main_c分区
);
#MAXVALUE 取决于id的类型
我们通过 show variables like 'datadir‘
看下表的主目录有什么变化
首先执行 show variables like 'datadir'; 查询出mysql存放数据文件的目录,然后进入目录,如下:
然后进行分区,执行分区代码
查看数据库文件目录变化,多了几个文件,是通过ID分割出来的文件。
5.分区查询,这时,我们就可以看到,rows=3,就不用把全部的rows查出来
。
6.合并分区
alter table 表名
reorganize partition 分区名1,分区名2 into
(partition 分区名 values less than (xx));
alter table news_main
reorganize partition news_main_a,news_main_b into
(partition news_main_a values less than (6));
#把news_main_a,news_main_b合并成news_main_a
7.删除分区
alter table 表名 drop partition 分区名;(丢数据)
Alter table 表名 remove partitioning; (不丢数据)
8.explain在分区的使用
EXPLAIN PARTITIONS select xxxxxx
9.强制使用某分区查询
select * from 表名 PARTITION(分区名)
10.指定路径分区
PARTITION p0 values less than (2) DATA DIR
ECTORY = 'D:/abc/1'
INDEX DIRECTORY = 'D:/abc/1',
11.list分区
partition by list(字段名)
(
partition p1 values in (字段值1,字段值2),
partition p2 values in (字段值3,字段值4),
partition p3 values in (字段值5,字段值6)
);
常用在把不同分类的商品 分区分出去
11.