如果一张表的数据量太大的话,那么myd,myi就会变得很大,查找数据就会变得很慢,这个时候我们可以利用mysql的分区功能,在物理上将这一张表对应的三个文件,分割成许多个小块,这样呢,我们查找一条数据时,就不用全部查找了,只要知道这条数据在哪一块,然后在那一块找就行了。如果表的数据太大,可能一个C盘放不下,这个时候,我们可以把数据分配到不同的磁盘里去。
通俗的讲表分区是将一大表,根据条件分割成若干个小表,如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区,也可以根据其他的条件分区。
分区表,就是对表进行分区,通常数据库会把不同的分区物理上分隔离开进行管理,这样做有很多优点:
1:可以提高查询的效率,查询的时候如果对用作分区的关键字来进行过滤的话(在WHERE中),那么就可以避免对全表进行扫描,节省磁盘IO。比如数据库中存储了近3年的数据,按月进行了分区,如果只查询某一个月的数据,就可以跳过35个不相关的分区,只要扫描一个分区就可以了。
2:可以提高删除的效率。比如经常见到的需要对过期数据进行删除时,如果用DELETE的话,那么要扫描全表才能完成这个操作。而如果表按时间进行了分区,那么只要把过期的分区DROP掉就可以了,效率比DELETE高的多
create table t1(i int)partitioned by (x int,y string);
这里是按照x,y来进行分区的,他们既可以是本来就存在于源数据中的某两个字段,也可以是两个从源数据中计算得到的用于分区的字段。
比如
insert into t1 partition(x=10,y='a') select c1 from some_other_table;
insert into t1 partition(x,y='b') select c1,c2 from some_other_table;
第一句话是把t1=c1插入到x=10,y=’a’这个分区中,第二句话是把t1=c1插入到x=c2、y=’b’的分区中。
分区可以极大的增加数据查询、删除的效率,是个非常好的东西,只是分区要在建表的时候预先设计好。通常数据库都不支持建表后增加分区,能做到的方法基本也是新建一张分区表,然后把原表中的数据复制过去。