Mysql 数据表优化 Partition分区操作

时间: 2017-10-17  分类: php+Mysql  收藏

当一个表里面的数据特别多时,比如单个表数据达到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上执行


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

评论

昵 称: