1、传统项目结构
2、数据库性能瓶颈
① 数据库连接 数据库连接是非常稀少的资源,MySQL数据库默认100个连接,单机最大1500连接。如果一个库里既有用户相关的数据又有商品、订单相关的数据,当海量用户同时操作时,数据库连接就很可能成为瓶颈。
② 数据量 MySQL单库数据量在5000万以内性能比较好,超过阈值后性能会随着数据量的增大而变弱。MySQL单表的数据量是500w-1000w之间性能比较好,超过1000w性能也会下降。
③ 硬件问题 因为单个服务的磁盘空间是有限制的,如果并发压力下所有的请求都访问同一个节点,肯定会对磁盘IO造成非常大的影响。
数据库性能优化
① 参数优化 ② 缓存、索引 ③ 读写分离 ④ 分库分表 (最终方案)
4 分库分表介绍
4.1 使用背景
当表的数量达到了几百上千张表时,众多的业务模块都访问这个数据库,压力会比较大,考虑对其进行分库。
当表的数据达到了几千万级别,在做很多操作都比较吃力,考虑对其进行分库或者分表
4.2.1垂直切分
按照业务模块进行切分,将不同模块的表切分到不同的数据库中。
4.2.1.1 分库
4.2.1.2 分表
按照字段将大表拆分成小表,另当表中含有Blob、Clob(用于存头像、小图片等)等二进制类型的字段时,因其不能使用索引,考虑性能问题需将其拆分出来。
4.2.2 水平切分
将一张大表按照一定的切分规则,按照行切分成不同的表或者切分到不同的库中。
4.2.2.1 范围式拆分
好处:增删数据库实例时数据迁移是部分迁移,扩展能力强。 坏处:热点数据分布不均,访问压力不能负载均衡。
4.2.2.2 hash式拆分
好处:热点数据分布均匀,访问压力能负载均衡。 坏处:增删数据库实例时数据都要迁移,扩展能力差。
4.2.2.3 水平切分规则
① 按照ID取模:对ID进行取模,余数决定该行数据切分到哪个表或者库中。
② 按照日期:按照年月日,将数据切分到不同的表或者库中。
③ 按照范围:可以对某一列按照范围进行切分,不同的范围切分到不同的表或者数据库中。
4.2.3 切分原则
① 能不切分尽量不要切分。
② 如果要