Mysql 数据表优化 Partition分区操作
当一个表里面的数据特别多时,比如单个表数据达到10G,读取效率会非常低,这时可以把数据表分表解决问题。 把数据大小分散到各个文件中,避免出现一个文件10G 20G的情况。
方式一:通过业务逻辑根据数据的大小通过id%10等类似这种方法分成像 user1, user2, user3这样,但这样会出现很多其它问题,且每次读取数据和写入数据的时候还要去判断取那张表,这个是我们通过程序去识别写表和读表的。
方式二:mysql可以通过Partition进行分区,这种分区,mysql中显示的数据依然在一个数据表里面,不影响读取查询数据。mysql内部的文件机制实现了将数据存储在不同的数据文件里,这样的好处是mysql自动将对应的数据分到的不同的.myd文件里面去,大大降低文件的大小,效率自然提高很多。
1. 创建partition的表
创建partition表时,如用了非支持函数,会出现“This partition function is not allowed”的错误提示
mysql> create table log_partition (
-> dt datetime not null,
-> info varchar(100) not null,
-> index ( dt)
-> )
-> partition by range(year(dt))(
-> partition p0 values less than ( 2005),
-> partition p1 values less than (2006),
-> partition p2 values less than ( 2007),
-> partition p3 values less than ( 2008),
-> partition p4 values less than maxvalue
-> );
Query OK, 0 rows affected (0.19 sec)
mysql> show create table log_partition
| log_partition | CREATE TABLE `log_partition` (
`dt` datetime NOT NULL,
`info` varchar(100) NOT NULL,
KEY `dt` (`dt`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (year(dt))
(PARTITION p0 VALUES LESS THAN (2005) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN (2006) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (2007) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN (2008) ENGINE = InnoDB,
PARTITION p4 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */ |
2.每个Partition占用一个单独的文件,数据大小也会分散到各个文件中,避免出现一个文件10G 20G的情况

3.用explain查看查询在哪个partition上执行

效果不用再说了,当然了,数据量小的话也没必要这么做,分区多,数据表操作的时候也是挺慢的。