一、背景
当今互联网大爆炸的时代,业务越来越多和大,单库单表数据超出数据库支持容量,数据库I/O操作次数会越来越多和慢,数据库的整体性能就会急剧下降。
二、如何优化
这里我想到几种优化的方法
- 减少数据库访问压力
- 使用缓存技术,对数据库的信息进行缓存,减少数据库访问压力
- 使用Nginx进行静态资源的获取,对一些高访问的网页,一次访问时可以先生成静态页面存到本地中,用户再次访问就会直接返回,这样减少与数据库的交互和渲染页面的操作,提高效率
- 读写分离
互联网业务一般读多写少,读写比例基本是10:1。比如订单业务,顾客购买商品生成一次订单后,就会多次查看订单情况。这时可以采用主从架构,主库负责DML(增删改)操作,从库负责DQL(查看操作),一个主库可以有多个从库,极大减轻读写压力
- 提升数据库性能
- 可以从机器性能入手,内存不够加内存条,外存( 如硬盘 )不够加外存,这样即使数据量在大,也不会影响I/O读写速率,但是,数据量大会增加I/O的次数,数据库性能依旧会下降,不推荐,成本太高,没钱花,/(ㄒoㄒ)/~~
- 优化数据库索引,数据库语句,这个我将会写篇博客,具体介绍
- 分库分表
分库分表要按业务进行拆分,具体后面会说。主要是打破单库单表的情况,数据存在多库多表中。打个比方,100W条数据存在10个库中,10个库有10张相同的表,那么一张表存的数据就会1W条左右,这样减低数据库的容量,提升I/O操作速率,提高数据库的性能
三、什么是分库分表
分库分表,顾名思义就是拆分数据库和拆分数据表。问题就来了,要怎么拆分数据库和数据表呢?
这里用一张电商的数据库的ER图拆分
- 垂直拆分( 以电商ER图拆分 )
- 垂直拆库:按照业务拆分,业务耦合性低的数据表拆分到不同数据库中。比如电商数据库拆分成用户库、商品库、订单库…但是,不是什么表都可以分库的,例如:订单库有订单表和订单明细表,这两张表耦合性高,必须放在一起
- 垂直拆表:按照数据表的字段热点(就是使用频率高)和字段存储类型进行拆分。比如电商中商品不是有文字描述吗?可是我们一般看商品的标题,价格,图片,对于文字描述字段一般点进去才看(查看频率不如前者高),那么我们可以把商品表除文字描述这些大字段拆分出另一张表使用,提高查询性能
PS:拆分大字段还有另一个原因,因为大字段读取时间长,数据量大的话,影响I/O的读取效率
- 特点:
- 每个库(表)的结构都不一样
- 每个库(表)的数据都(至少有一列)一样
- 每个库(表)的并集是全量数据
- 水平拆分( 以电商ER图拆分)
- 水平拆库:把单个数据库的数据拆分成多个相同结构数据库存储
- 水平拆表:把单表的数据量拆分成多个相同结构表存储
- 以上两者合并达到分库分表
- 特点:
- 每个库(表)的结构都不一样
- 每个库(表)的数据都(至少有一列)一样
- 每个库(表)的并集是全量数据
四、优势和弊端
- 优点:
- 减少数据库的访问压力和单个存储容量
- 弊端:
- 增加了我们维护成本,毕竟多个数据库和数据表维护
- 分布式事务(跨库事务),比如:处理一个业务需要执行多条插入语句,每条在不同机器的不同数据库中,出现问题,如何回滚
- 跨库join,因为在不同数据库中,就无法使用join命令获取信息