MySQL-mysql 分表真正的意义在哪里?
mysql在很多时候启用分表存储数据!比如:用户基本信息和用户一些扩展信息是分表存储的,但是真的意义在哪里?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
mysql在很多时候启用分表存储数据!比如:用户基本信息和用户一些扩展信息是分表存储的,但是真的意义在哪里?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(7)
主要还是为了提高检索速度,减少磁盘的io。可以按照hash或者md5,还可以按照uid左移多少位分表。都行。
分表,提高了数据操作的效率,尤其是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中。
优点:数据分布均匀
缺点:数据迁移的时候麻烦,不能按照机器性能分摊数据
真正的意义就是比如在上亿级别的一个表里,
带条件的查询需要遍历整个数据表的对应字段,
寻找符合条件数据,
如果分表以后可以让查询减小范围,
避免不必要的磁盘检索,
最终实现定向小范围快速查询
使得单表单次查询所需的检索行数变少,时延变短。
使得产生表锁争夺的几率和代价变低,吞吐量变高。
减少热点争用,提升执行效率。
比分表更重要的是分库,成倍提升整个系统的容量。
补充一个:
1、使用MyISAM存储引擎创建表的时候,当表不包含变量长度列(VARCHAR, BLOB, 或TEXT)时,表使用静态格式存储,这种格式每一行用固定的字节来存储,能提高读取速度
2、将大字段从原表中拆分出来,通过单独的表进行存放,让我们在访问其他数据的时候大大降低 IO 访问,从而使性能得到较大的改善。
具体的,可以阅读《MySQL性能调优与架构设计》这边书,写得很不错
分表的目的在于,减小数据库的负担,缩短查询时间。单张表的访问及写入很频繁,这时候就可以根据一定的业务规则来分表,这样就能减轻单表压力,并且还能解决各个模块的之间的频繁交互问题。
另外比如说用户信息表,我们把用户的基本信息(如用户id,用户名)放在一个表中,再将其他用户扩展信息放在另外的一些表中,这样既因为基本信息的访问非常频繁,另外也方便了我们使用mencache等缓存来替代这个表的查询功能,如果启用缓存,程序改动也会非常的小。
我觉得主要还是解决锁表的问题,缩短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的唯一性检查采用别的方式解决