MySQL
一、MySQL分库分表
随着订单数据的增加,当MySQL单表存储数据达到一定量时其存储及查询性能会下降,在阿里的《Java 开发手册》中提到MySQL单表行数超过 500 万行或者单表容量超过 2GB时建议进行分库分表。
分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成 ,将数据大表拆分成若干数据表组成,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目 的。
分库分表的四种方式:垂直分库、水平分库、垂直分表、水平分表
垂直分表
是将一个表按照字段分成多表,每个表存储其中一部分字段,比如按冷热字段进行拆分。
垂直分表带来的好处是:充分发挥热门数据的操作效率,商品信息的操作的高效率不会被商品描述的低效率所拖累。
通常我们按以下原则进行垂直拆分:把不常用的字段单独放在一张表;把text,blob等大字段拆分出来放在附表中;经常组合查询的列放在一张表中;
垂直分库
通过垂直分表性能得到了一定程度的提升,但是还没有达到要求,并且磁盘空间也快不够了,因为数据还是始终限
制在一台服务器,库内垂直分表只解决了单一表数据量过大的问题,但没有将表分布到不同的服务器上,因此每个表还是竞争同一个物理机的CPU、内存、网络IO、磁盘。
垂直分库是指按照业务将表进行分类,分布到不同的数据库上面,每个库可以放在不同的服务器上,它的核心理念 是专库专用,微服务架构下通常会对数据库进行垂直分为,不同业务数据放在单独的数据库中,比如:客户信息数据库、订单数据库等。
垂直分库通过将表按业务分类,然后分布在不同数据库,并且可以将这些数据库部署在不同服务器上,从而达到多个服务器共同分摊压力的效果,但是依然没有解决单表数据量过大的问题。
水平分库是把同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器上,比如:单数订单在db_orders_0数据库,偶数订单在db_orders_1数据库。
当一个应用难以再细粒度的垂直切分,或切分后数据量行数巨大,存在单库读写、存储性能瓶颈,这时候就需要进行水平分库了,经过水平切分的优化,往往能解决单库存储量及性能瓶颈。但由于同一个表被分配在不同的数据库,需要额外进行数据操作的路由工作,因此大大提升了系统复杂度。
水平分表是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中,比如:0到500万的订单在orders_0数据、500万到1000万的订单在orders_1数据表。水平分表优化了单一表数据量过大而产生的性能问题
二、MVCC(多版本并发控制)
当前读
读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:select …lock in share mode(共享锁),select …for update、update、insert、delete(排他锁)都是一种当前读。
快照读
简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。
Read Committed:每次select,都生成一个快照读。
Repeatable Read:开启事务后第一个select语句才是快照读的地方。
Serializable(串行化):快照读会退化为当前读。
MVCC
全称 Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现。还需要依赖于数据库记录中的三个隐式字段、undo log日志、readView.
undo log
回滚日志,在insert、 update、delete的时候产生的便于数据回滚的日志。当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除。而update、delete的时候,产生的undo log日志不仅在回滚时需要,在快照读时也需要,不会立即被删除。
undo log 版本链
不同事务或相同事务对同一条记录进行修改,会导致该记录的undolog生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。而update、delete的时候,产生的undo log日志不仅在回滚时需要,在快照读时也需要,不会立即被删除。
readview
规则:
RC:读已提交
RR:可重复读
三、主从复制
主从复制是指将数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。
MYSQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制。
优点:
主库出现问题,可以快速切换到从库提供服务;
实现读写分离,降低主库的访问压力;
可以在从库中执行备份,以避免备份期间影响主库服务;
复制分为三步:
- Master 主库在事务提交时,会把数据变更记录在二进制文件Binlog中。
- 从库读取数据库的二进制日志文件Binlog,写入到从库的中继日志Relay log。
- slave重做中继日志中的事件,将改变反映它自己的数据。
四、子查询与联合查询
- 子查询是一个嵌套在其他查询(称为主查询)中的查询。它是一个完整的查询语句,并且返回的数据将作为主查询的一部分来使用,比如用于条件判断、计算列的值等。子查询通常使用括号括起来,以明确它是一个独立的查询单元。
- 特点:
- 独立性:子查询本身是一个独立的查询,可以在单独的环境中进行测试和理解。它有自己的
SELECT
、FROM
、WHERE
等子句,能够完成一个完整的查询功能。 - 数据传递:子查询的结果通常是作为一个数据集(如一列值或一个表结构)传递给主查询,主查询根据子查询的结果来进一步筛选、计算或关联数据。
- 执行顺序:在大多数数据库系统中,子查询会先执行,然后将结果提供给主查询使用。所以子查询的性能可能会对整个查询的性能产生较大影响,尤其是当子查询比较复杂或者返回的数据量很大时。
- 独立性:子查询本身是一个独立的查询,可以在单独的环境中进行测试和理解。它有自己的
- 联合查询(Union Query)
- 定义:
- 联合查询是将两个或多个查询的结果集合并为一个结果集的查询方式。这些查询通常具有相似的结构,即它们的列数相同,并且对应的列的数据类型也相同(在大多数数据库系统中有这样的要求)。联合查询使用
UNION
(或者UNION ALL
)关键字来实现。
- 联合查询是将两个或多个查询的结果集合并为一个结果集的查询方式。这些查询通常具有相似的结构,即它们的列数相同,并且对应的列的数据类型也相同(在大多数数据库系统中有这样的要求)。联合查询使用
- 定义:
相关子查询访问数据库的次数可能会多于连接查询。因为相关子查询可能需要为每个主查询行重新执行子查询,而连接查询一般是对参与连接的表进行一次性的关联操作。
原文地址:https://blog.csdn.net/qq_69331283/article/details/143923608
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!