某个表有近千万数据,CRUD比较慢,如何优化?(数据库高可用)

分库分表

分库分表包括分库和分表两个部分,在生产中通常包括:垂直分表、垂直分库、水平分表、水平分库四种方式。

垂直分表

把主键和一些列放在一个表,然后把主键和另外的列放在另一个表中。
在这里插入图片描述

垂直分表的优点:将一个大表拆分为不同包含不同模块的小表,可以让分别查询两个表的用户不受影响。
垂直分表的缺点:查询所有数据需要join操作,单标的数据量可能还是比较大。

垂直分库

垂直分库是指按照业务将表进行分类,分布到不同的数据库上面,每个库可以放在不同的服务器上,它的核心理念是专库专用。
在这里插入图片描述

垂直分库的优点:解决业务层面的耦合,业务清晰。
垂直分库的缺点:依然没有解决单表数据量过大的问题。

水平分表

保持数据表结构不变,通过某种策略将存储数据分片,这样每一片数据分散到不同的表中。 水平拆分可以支撑非常大的数据量。
在这里插入图片描述

水平分表的优点:优化单一表数据量过大而产生的性能问题。
水平分表的缺点:给应用增加复杂度,通常查询时需要多个表名,查询所有数据都需UNION操作。

水平分库

水平分库是把同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器上。
在这里插入图片描述

水平分库的优点:解决了单库大数据,高并发的性能瓶颈。
水平分库的缺点:同一个表被分配在不同的数据库,查询时需要多个数据库。

主从复制+读写分离

主从复制

将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做);从而使得从数据库的数据与主数据库保持一致。

主从复制的过程

在这里插入图片描述

  1. 主服务器上面启动一个binlog线程,主服务器的任何修改都会保存在Binary log(二进制日志)里面。
  2. 从服务器上面启动一个I/O线程,连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Realy log(中继日志)里面。
  3. 从服务器上面开启一个SQL线程,定时检查Realy log,如果发现有更改立即把更改的内容在本机上面执行一遍。

主从复制的模式

  1. 异步复制模式:主库接受到客户请求后,处理完事务后,立即将结果返给客户端,不关心从库是否已经接收并处理。客户体验度高,访问从库可能没有数据。
  2. 全同步复制:当主库执行完一次事务,且所有从库都接受并处理之后,才返回给客户端。客户体验度差,数据同步好。
  3. 半同步复制:介于两种模式之间,主库执行一次事务后,等待至少一个从库接受并写到relay log中才返回给客户端。

主从复制的优点

  1. 做数据的备份,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
  2. 可以做读写分离,使数据库能支持更大的并发。如果进程A使用master,进程B使用slave,那么进程B将不会影响进程A的速度。

主从复制的缺点

  1. 主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间主从数据不一致的情况。
  2. 主服务器宕机,但是数据还没写入到binlog,可能会造成主从数据不一致。

读写分离

读写分离是依赖于主从复制,而主从复制又是为读写分离服务的。因为主从复制要求slave不能写只能读。

通过设置主从数据库实现读写分离,主数据库负责“写操作”,从数据库负责“读操作”,根据压力情况,从数据库可以部署多个提高“读”的速度,借此来提高系统总体的性能。

主从同步过程中,SQL线程可不可以并行执行?

不可以,因为这样可能SQL执行的顺序不同,导致事务提交时间有差异。

缓存

redis

Redis是一个使用 C 语言开发的数据库,不过与传统数据库不同的是Redis 的数据是存在内存中的,也就是它是内存数据库,所以读写速度非常快,因此Redis被广泛应用于分布式缓存方向。

关于redis的详解请移步redis专栏。

  • 7
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值