一般分表操作有垂直拆分和水平拆分。顾名思义。
1. 垂直拆分是指,这个表的列,即字段,要拆分成两个或多个表。
这个应用场景比如:这个表字段,几个都是int、datetime等,有那么一个是text类型的,而这个text的字段还不是被经常检索,而其他几个字段要被经常检索。当出现效率问题时,我们可以考虑垂直拆分表。把这个text字段拆出来,可以提高检索效率。两个表建立关系可以利用原来表的主键。
2. 水平拆分是指,把一个可能或者已经是大数据量的表拆分成多个表。
一个表数据量很大时,比如超过百万或者更多,那么数据量仍然可能在扩充的时候,即便是加索引,检索效率也不高。很自然想到要表拆分。
比如一张用户表,这个量会比较大。比如我根据业务的拓展形式,预算的量,我分成100张表。比如,user0,user1。。。user99。
拆分以后,当然是尽可能让用户数据平均分散在各个表里。怎么对用户数据的存取呢?可以有多种方法,比如散列或者取模。
1)取模方法(模上分表数):比如新增一个用户,我们可以利用数据库表的自增,建立一个专门生成主键id的表。利用这个表,我们得到用户表的最新id。比如生成的id是100,使用100%100,取模后是0,那么插入到user0表里;id是199,取模后插入user99里。
存数据是这样,取数据同样道理。当我们知道这个用户的id后,比如是356,利用取模结果是56,我们就去user56表找这个id=356的数据。
2)散列法:比如假设我们认为crc32()方法的后两位数字是随机生成的。
返回表名的方法:
<?php function userT($id){ $table = "user"; $str = crc32($table. $id); return $table. substr($str, -2, 2); }
当然,如果不知道用户id,比如只知道昵称,去找用户数据。那么这样就比较坑爹了。就需要遍历表查找了。
mysql分表有一篇文章写的不错,可以参考:http://blog.51yip.com/mysql/949.html