原因:数据量过大导致数据库性能降低。
a. 垂直分库:按照业务将 不同 的表分类放到不同数据库上。
- 解决业务层耦合
- 能对不同业务的数据进行管理,维护,监控和扩展。
- 高并发场景下提高IO、数据库连接数。
b. 垂直分表:按字段分表,将不常使用的字段分到另一个表。尽量避免连表查询,得不偿失。
- 避免io争抢并减少锁表几率
- 充分发挥热门数据的操作效率,不会被冷门信息的低效率拖累,减少io操作。
- 数据库以行为单位加载数据到内存,字段短且访问频率高,内存能加载更多数据,命中率更高,减少磁盘io。
原则:
- 经常查询的放一张表
- 大字段和不常用的分离
c. 水平分库:将 同一个 表的数据按照一定规则分到不同数据库中。数据库数量增加,导致运维成本提高。
d. 水平分表:在同个数据库中将同个表按照一定规则拆到多个表中。
- 避免单表数据量过大产生的性能问题
- 减少单表io争抢和锁表几率
为什么大字段io性能降低?
- 数据量大,需要更长的读取时间。
- 数据读取以页为单位,如果数据占空间大造成单页存储的行数少,IO效率降低。
分库分表应用
一般在系统设计时根据业务的耦合程度进行垂直分库和垂直分表的设计。在数据量和访问量不太大时,首先考虑缓存,索引,读写分离提高性能。若数据量极大,再考虑水平分库分表。
分库分表带来的问题
- 事务一致性问题:分布式事务
- 跨节点关联查询
- 主键避重:采用全局主键
- 公共表:多个的数据库都需要用一个表