mysql不同的引擎有不同的表容量限制:比如5.0之后MYISAM单表的文件容量限制是256TB如果不受磁盘空间影响
我们先来熟悉下概念:
什么是分库分表?
什么是分表?
什么情况下分库?
什么情况下分表?
1、什么是分库
分库其实分为 水平划分,垂直划分
水平划分:
比如 某商城系统,店铺表数据量非常大,严重影响了整个DB的性能,这时候我们可以考虑用分库(当然分表也解决不了),把店铺表按照某种策略划分到不同的数据库,两个库的结构一致,比如就按照 用户ID是奇数的存在A库,用户ID是偶数的存在B库。
垂直划分:
比如上面的商城系统,我们可以考虑把 商品信息和店铺信息分库存储,商品信息存在在A库,店铺信息存储在B库
2、什么是分表
比如上面的商城系统,商品表,我们可以用分表去存储,按照一定的规则,比如goods_id 对4 求于的方式去划分,当添加一个商品的ID是123,,123 mod 4,次商品存储在goods_0003表中,
3、什么情况下用分表
在实际的开发中 当单表的数据量超过500万条记录时,可考虑使用分表。
4、什么情况下用分库
当写的压力很大的时候,必须用分库
分库分表产生的问题 以及注意事项
1、分库分表的维度问题
比如 用户购买商品要将交易记录保存起来,如果按照用户的维度分表,则每个用户的交易记录都保存在同一个表中,所以很快,很方便查找到用户的 交易情况,但要获取 商品的购买情况
可能分布在多张表中查找起来比较麻烦,反之按照商品的维度分表,就很容易的获取商品的购买情况,但要获取用户的交易记录就比较麻烦
所以常见的解决方式有:
a、通过扫描表的方式,此方法不可取,效率太低
b、记录两份数据 一份按照用户维度,一份按照商品维度
c、通过搜索引擎解决但如果实时要求很高,有地关系到实时搜索
2、联合查询
联合查询不可取,因为可能不在同一库。
3、避免跨库事务
一个事物中涉及两个库中的表数据,操作起来负责 而且效率也低
4、尽量把同一组数据放在同一DB上
例如卖家A的商品和交易信息都放在数据库db0上,即使db1挂了卖家A的相关东西也可以正常使用
在实际的应用中,绝大数数据都是读远大于写,mysql提供了读写分离的机制,所有写的操作都必须对应都master,读的操作可以在master和slave机器上进行,slave和master的结构完全一样,
一个master可以有多个slave 甚至slave下面也可以挂slave
所有写的操作都在master上发生,同时同步更新到slave上,所以master同步到slave机器上有一定的延迟,而且这种延迟也会随着slave的增加而严重
所以
1、当读的压力很大的时候可以考虑slave机器分布式解决,但当slave机器达到一定数量的时候就低考虑分库
2、当写的压力很大的时候必须考虑分库操作