我觉得主要还是解决锁表的问题,缩短SQL执行时间。
我了解的分表方式有这么几种
1.基本信息一个表 详细信息一个表
2.解决1对1 , 1对多 多对多的关系
3.像日志这样的有时间性,可以一个月一个表
4.像用户这样的有用户ID,可以根据用户ID的大小分段,1-10000一个表
5.hash分表
6.表分区,MYSQL在5.3后支持表分区了,目的也一样
我说一下我的一个应用吧,我用的是HASH分表,对用户名做HASH进行分表,用户量目前为1亿,
分了100个用户分表,每个分表里存着100万条用户信息,分表里冗余了user_id user_name,因为这二个字段是不会变的
几种应用场景:
1、注册,对用户名HASH,然后写入对应的分表
2、登录,通过用户名HASH值,直接查相应的分表
3、修改密码、修改用户信息,直接改相应的分表
对于注册时自增user_id,user_name的唯一性检查采用别的方式解决
------------------------------
分表的目的在于,减小数据库的负担,缩短查询时间。单张表的访问及写入很频繁,这时候就可以根据一定的业务规则来分表,这样就能减轻单表压力,并且还能解决各个模块的之间的频繁交互问题。
另外比如说用户信息表,我们把用户的基本信息(如用户id,用户名)放在一个表中,再将其他用户扩展信息放在另外的一些表中,这样既因为基本信息的访问非常频繁,另外也方便了我们使用mencache等缓存来替代这个表的查询功能,如果启用缓存,程序改动也会非常的小。
1、使用MyISAM存储引擎创建表的时候,当表不包含变量长度列(VARCHAR, BLOB, 或TEXT)时,表使用静态格式存储,这种格式每一行用固定的字节来存储,能提高读取速度
2、将大字段从原表中拆分出来,通过单独的表进行存放,让我们在访问其他数据的时候大大降低 IO 访问,从而使性能得到较大的改善。
---------------------------------
分表,提高了数据操作的效率,尤其是Write操作的效率。
例如:
对user_id进行hash(或者如果user_id是数值型的话直接使用user_id 的值也可),然后用一个特定的数字,比如应用中需要将一个数据库切分成4个数据库的话,我们就用4这个数字对user_id的hash值进行取模运算,也 就是user_id%4,这样的话每次运算就有四种可能:结果为1的时候对应DB1;结果为2的时候对应DB2;结果为3的时候对应DB3;结果为0的时 候对应DB4,这样一来就非常均匀的将数据分配到4个DB中。
优点:数据分布均匀
缺点:数据迁移的时候麻烦,不能按照机器性能分摊数据
真正的意义就是比如在上亿级别的一个表里,
带条件的查询需要遍历整个数据表的对应字段,
寻找符合条件数据,
如果分表以后可以让查询减小范围,
避免不必要的磁盘检索,
最终实现定向小范围快速查询
原文:http://www.cnblogs.com/duanxz/p/3770181.html