1.分表类型
分表有两种形式:分别是水平分表和垂直分表:
水平分表是指创建多个表结构相同的表,然后根据业务逻辑的需要把数据分别放到不同的表中去,水平分割会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要union操作。在许多数据库应用中,这种复杂性会超过它带来的优点,但当某个表的数据量特别大的时候(比如百万级别数据),那就得考虑分区或者水平分表了
垂直分表是指 某个表的字段太多了,而且特别多大的字段,这是候就可以考虑把对此表进行垂直分表,比如:user表中含有大量字段,
而且该开发中需要多次操作此表,那我们就可以把该表拆分为user表和userinfo表
2.水平分表分类
1.逻辑水平分表:
好处:可以在不修改代码的前提上就能实现分表改善读写效率。
前提 : 该表的表引擎得是merge
缺点:效率没有真正的分表的效率高
mysql> CREATE TABLE IF NOT EXISTS `user1` ( -> `id` int(11) NOT NULL AUTO_INCREMENT, -> `name` varchar(50) DEFAULT NULL, -> `sex` int(1) NOT NULL DEFAULT '0', -> PRIMARY KEY (`id`) -> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; Query OK, 0 rows affected (0.05 sec) mysql> CREATE TABLE IF NOT EXISTS `user2` ( -> `id` int(11) NOT NULL AUTO_INCREMENT, -> `name` varchar(50) DEFAULT NULL, -> `sex` int(1) NOT NULL DEFAULT '0', -> PRIMARY KEY (`id`) -> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO `user1` (`name`, `sex`) VALUES('张映', 0); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `user2` (`name`, `sex`) VALUES('tank', 1); Query OK, 1 row affected (0.00 sec) mysql> CREATE TABLE IF NOT EXISTS `alluser` ( -> `id` int(11) NOT NULL AUTO_INCREMENT, -> `name` varchar(50) DEFAULT NULL, -> `sex` int(1) NOT NULL DEFAULT '0', -> INDEX(id) -> ) TYPE=MERGE UNION=(user1,user2) INSERT_METHOD=LAST AUTO_INCREMENT=1 ; Query OK, 0 rows affected, 1 warning (0.00 sec)
按照以上的代码逻辑去建表,然后读写都操作alluser表即可,简单方便。
2.直接水平分表
好处:效率比上面的逻辑分表的效率要高
缺点 : 复制,读写都要去操作不同的表
把出现大数据量且访问频繁的表,将其分为若干个表,如:把message 表分为message_00,message_01,message_02,
直到message_99等,在写入数据的时候要根据业务需求或者一定的规律去写入到不同的表中去,在需要进行读操作时,
使用union 和 union all 操作把查询出来的数据拼接一起