一般来讲,mysql中一个表的总记录超过1000W,就会出现性能的大幅度下降。可以通过分表与分区实现优化。
除了按照hash来分区,还可以按照时间等来自定义分区规则。
1. 分表
一张表分成很多表后,每一个小表都是完整的一张表,都对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表结构文件。#alluser为虚拟的总表,user1与user2为实际的分表 [root@BlackGhost test]# ls |grep user alluser.MRG alluser.frm user1.MYD user1.MYI user1.frm user2.MYD user2.MYI user2.frm
2. 分区
一张大表进行分区后,他还是一张表,不会变成二张表,但是他存放数据的区块变多了。#按照id的哈希值分为三个区。 mysql> create table user(id int)partition by hash(id)partitions 3; #分区后的文件形式,可以注意到user.par存放了分区的描述 [root@BlackGhost test]# ls |grep user user#P#p1.MYD user#P#p1.MYI user#P#p2.MYD user#P#p2.MYI user#P#p3.MYD user#P#p3.MYI user.frm user.par
除了按照hash来分区,还可以按照时间等来自定义分区规则。
3.比较
分表与分区都可以做到对开发人员代码透明。
不同的子表或区块都可以位于不同的磁盘上,提高并发性能。