MySql进阶篇(附面试快速答法)

news2024/11/19 3:43:17

文章目录

  • 1、慢查询
    • 1.1、如何定位慢查询呢?
      • 小总结
      • 面试快速答法
    • 1.2、SQL语句执行很慢, 如何分析呢?
      • 小总结
      • 面试快速答法
  • 2、存储引擎
    • 2.1、MySQL体系结构
    • 2.2、存储引擎特点
    • 小总结
  • 3、索引
    • 3.1、什么是索引?
      • 小总结
      • 面试快速答法
    • 3.2、聚集索引和非聚集索引
      • 小总结
      • 面试快速答法
    • 3.3、覆盖索引
      • 小总结
      • 面试快速答法
    • 3.4、索引创建原则
      • 小总结
      • 面试快速答法
    • 3.5、索引失效
      • 小总结
      • 面试快速答法
  • 4、SQL优化
    • 小总结
    • 面试快速答法
  • 5、事务
    • 小总结
    • 面试快速答法
  • 6、并发事务
    • 小总结
    • 面试快速答法
  • 7、undo log和redo log的区别
    • 小总结
    • 面试快速答法
  • 8、MVCC
    • 小总结
    • 面试快速答法
  • 9、主从同步
    • 小总结
    • 面试快速答法
  • 10、分库分表
    • 拆分策略
    • 小总结

思维导图

在这里插入图片描述

1、慢查询

在MySQL中,如何定位慢查询?

这时要结合自己项目的业务,想一下,出现慢查询的原因是啥?

  • 聚合查询 考虑新增一个临时表
  • 多表查询 优化sql语句的结构
  • 表数据量过大查询 添加索引
  • 深度分页查询

慢查询的表现是啥?

页面加载过慢,接口压测响应时间过长(超过1s)

1.1、如何定位慢查询呢?

方案一:开源工具

  • 调试工具:Arthas,用命令的方式监控已上线的项目,可以跟踪执行比较慢的方法,查看方法的执行时间
  • 运维工具:Prometheus、Skywalking 查看接口的响应情况,还提供了一个追踪的功能,详细查看接口的执行情况

方案二:MySql自带慢日志

慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志

如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

在这里插入图片描述

配置完毕之后,通过以下指令重新启动MySQL服务器进行测试,查看慢日志文件中记录的信息

/var/lib/mysql/localhost-slow.log

在这里插入图片描述

小总结

如何定位慢查询?

  1. 介绍一下当时产生问题的场景(我们当时的一个接口测试的时候非常的慢,压测的结果大概5秒钟)

  2. 我们系统中当时采用了运维工具( Skywalking ),可以监测出哪个接口,最终因为是sql的问题

  3. 在mysql中开启了慢日志查询,我们设置的值就是2秒,一旦sql执行超过2秒就会记录到日志中(调试阶段),生产场景下不会开启,因为会损失性能

面试快速答法

在这里插入图片描述

1.2、SQL语句执行很慢, 如何分析呢?

可以采用EXPLAIN 或者 DESC命令获取 MySQL 如何执行 SELECT 语句的信息

在这里插入图片描述

这里我们需要了解一些重要的字段

  • possible_key 当前sql可能会使用到的索引
  • key 当前sql实际命中的索引
  • key_len 索引占用的大小
  • Extra 额外的优化建议

通过key和key_len查看是否可能会命中索引

Extra额外的优化建议:

Extra含义
Using where; Using Index查找使用了索引,需要的数据都在索引列中能找到,不需要回表查询数据
Using index condition查找使用了索引,但是需要回表查询数据

另外还有type字段:指这条sql的连接类型,性能由好到差为NULL、system、const、eq_ref、ref、range、index、all

  • system:查询系统中的表
  • const:根据主键查询
  • eq_ref:主键索引查询或唯一索引查询
  • ref:索引查询
  • range:范围查询
  • index:索引树扫描
  • all:全盘扫描

index和all性能就太低了,需要做优化

小总结

那这个SQL语句执行很慢, 如何分析呢?

可以采用MySQL自带的分析工具 EXPLAIN

  • 通过key和key_len检查是否命中了索引(索引本身存在是否有失效的情况)

  • 通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描

  • 通过extra建议判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复

面试快速答法

在这里插入图片描述

2、存储引擎

MYSQL支持的存储引擎有哪些, 有什么区别 ?

存储引擎:就是存储数据、建立索引、更新/查询数据等技术的实现方式 。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。

特性MyISAMInnoDBMEMORY
事务安全不支持支持不支持
锁机制表锁表锁/行锁表锁
外键不支持支持不支持

2.1、MySQL体系结构

在这里插入图片描述

2.2、存储引擎特点

InnoDB

InnoDB是一种兼顾高可靠性和高性能的存储引擎,在 MySQL 5.5 之后,InnoDB是默认的 MySQL 存储引擎

特点

  • DML操作遵循ACID模型,支持事务

  • 行级锁,提高并发访问性能

  • 支持外键 FOREIGN KEY约束,保证数据的完整性和正确性

文件

  • xxx.ibd : xxx代表的是表名,innoDB引擎的每张表都会对应这样一个表空间文件,存储该表的表结构(frm、sdi)、数据和索引。

  • xxx.frm 存储表结构文件(MySQL8.0时,合并在表名.ibd中)

小总结

MYSQL支持的存储引擎有哪些, 有什么区别 ?

在mysql中提供了很多的存储引擎,比较常见有InnoDB、MyISAM、Memory

  • InnoDB存储引擎是mysql5.5之后是默认的引擎,它支持事务、外键、表级锁和行级锁

  • MyISAM是早期的引擎,它不支持事务、只有表级锁、也没有外键,用的不多

  • Memory主要把数据存储在内存,支持表级锁,没有外键和事务,用的也不多

存储引擎在mysql的体系结构哪一层,主要特点是什么

  • MySQL体系结构

  • InnoDB存储的特点

3、索引

3.1、什么是索引?

了解过索引吗?(什么是索引)

  • 索引(index)是帮助MySQL高效获取数据的数据结构(有序)

  • 用来提高数据检索的效率,降低数据库的IO成本

  • 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗

索引的底层数据结构了解过嘛 ?

MySQL默认使用的索引底层数据结构是B+树。再聊B+树之前,我们先聊聊二叉树和B树

在这里插入图片描述

数据结构对比

B-Tree,B树是一种多叉路平衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。

以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key,每个key都有一个指针

在这里插入图片描述

可以看到,在B树中,叶子节点和非叶子节点都会存放数据;

B+Tree是在BTree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构

在这里插入图片描述

在B+树中,所有的数据都存储在叶子节点

B树与B+树对比:

①磁盘读写代价B+树更低,非叶子节点只存储指针,叶子节点存储数据;

②查询效率B+树更加稳定;

③B+树便于扫库和区间查询,叶子节点是一个双向链表;

小总结

了解过索引吗?(什么是索引)

  • 索引(index)是帮助MySQL高效获取数据的数据结构(有序)

  • 提高数据检索的效率,降低数据库的IO成本(不需要全表扫描)

  • 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗

索引的底层数据结构了解过嘛 ?

MySQL的InnoDB引擎采用的B+树的数据结构来存储索引

  • 阶数更多,路径更短

  • 磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据

  • B+树便于扫库和区间查询,叶子节点是一个双向链表

面试快速答法

在这里插入图片描述

3.2、聚集索引和非聚集索引

什么是聚簇索引什么是非聚簇索引 ?

什么是聚集索引,什么是二级索引(非聚集索引),什么是回表?

分类含义特点
聚集索引(Clustered Index)将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据必须有,而且只有一个
二级索引(Secondary Index)将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键可以存在多个

聚集索引选取规则:

  • 如果存在主键,主键索引就是聚集索引。

  • 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。

  • 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

在这里插入图片描述

在这里插入图片描述

通过二级索引找到对应的主键值,到聚集索引中查找整行数据,这个过程就是回表

小总结

什么是聚簇索引什么是非聚簇索引 ?

聚簇索引(聚集索引):数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个(一般是主键)

非聚簇索引(二级索引):数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个

知道什么是回表查询嘛 ?

通过二级索引找到对应的主键值,到聚集索引中查找整行数据,这个过程就是回表

面试快速答法

在这里插入图片描述

3.3、覆盖索引

知道什么叫覆盖索引嘛 ?

覆盖索引是指查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到

在这里插入图片描述

可以看到有第三条sql语句,下面我们具体看看

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

小总结

知道什么叫覆盖索引嘛 ?

覆盖索引是指查询使用了索引,返回的列,必须在索引中全部能够找到

  • 使用id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。

  • 如果返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select *

MYSQL超大分页怎么处理 ?

问题:在数据量比较大时,limit分页查询,需要对数据进行排序,效率低

解决方案:覆盖索引+子查询

MYSQL超大分页处理

在数据量比较大时,如果进行limit分页查询,在查询时,越往后,分页查询效率越低。

我们一起来看看执行limit分页查询耗时对比:
在这里插入图片描述

因为,当在进行分页查询时,如果执行 limit 9000000,10 ,此时需要MySQL排序前9000010 记录,仅仅返回 9000000 - 9000010 的记录,其他记录丢弃,查询排序的代价非常大 。

优化思路:

一般分页查询时,通过创建 覆盖索引 能够比较好地提高性能,可以通过覆盖索引加子查询形式进行优化

在这里插入图片描述

面试快速答法

在这里插入图片描述

3.4、索引创建原则

索引创建原则有哪些?

  • 先陈述自己在实际的工作中是怎么用的

  • 主键索引

  • 唯一索引

  • 根据业务创建的索引(复合索引)

索引创建原则

  1. 针对于数据量较大,且查询比较频繁的表建立索引 单表超过10万数据
  2. 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引
  3. 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的查询效率越高
  4. 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立全缀索引
  5. 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率
  6. 要控制索引的数量,索引越多,维护索引结构的代价也就越大,会印象增删改的效率
  7. 如果索引列不能存储NULL值,请在创建表时使用NOT NULL 约束,当优化器知道每列是否包含NULL 值时,可以更好的查询哪个索引最有效的用于查询。

小总结

索引创建原则有哪些?

  1. 数据量较大,且查询比较频繁的表 重要
  2. 常作为查询条件、排序、分组的字段 重要
  3. 字段内容区分度高
  4. 内容较长,使用前缀索引
  5. 尽量联合索引 ,因为可以更好的使用覆盖索引,避免回表 重要
  6. 要控制索引的数量 重要
  7. 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它

面试快速答法

在这里插入图片描述

3.5、索引失效

什么情况下索引会失效 ?

举个栗子

给tb_seller创建联合索引,字段顺序:name,status,address

在这里插入图片描述

那如何判断索引是否失效了呢?

要解决这个问题,我们需要知道什么情况下索引会失效?

  1. 违法最左前缀法则

    如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始,并且不跳过索引中的列。匹配最左前缀法则,走索引:

在这里插入图片描述

违反最左前缀法则,索引失效:我们跳过name,直接查status和address

在这里插入图片描述

如果符合最左法则,但是出现跳跃某一列,只有最左列索引生效:
在这里插入图片描述

  1. 范围查询右边的列,不能使用索引

在这里插入图片描述

根据前面的两个字段 name , status 查询是走索引的, 但是最后一个条件address 没有用到索引。

  1. 不要在索引列上进行运算操作, 索引将失效
    在这里插入图片描述

  2. 字符串不加单引号,造成索引失效
    在这里插入图片描述

由于,在查询时没有对字符串加单引号, MySQL的查询优化器,会自动的进行类型转换,造成索引失效。

  1. 以%开头的Like模糊查询,索引失效。如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效

在这里插入图片描述

小总结

什么情况下索引会失效 ?

①违反最左前缀法则

②范围查询右边的列,不能使用索引

③不要在索引列上进行运算操作, 索引将失效

④字符串不加单引号,造成索引失效。(类型转换)

⑤以%开头的Like模糊查询,索引失效

面试快速答法

在这里插入图片描述

4、SQL优化

谈一谈你对sql的优化的经验

1、表的设计优化

表的设计优化(参考阿里开发手册《嵩山版》)

①比如设置合适的数值(tinyint int bigint),要根据实际情况选择

②比如设置合适的字符串类型(char和varchar)char定长效率高,varchar可变长度,效率稍低

2、索引优化

3、SQL语句优化

​ ①SELECT语句务必指明字段名称(避免直接使用select * )

​ ②SQL语句要避免造成索引失效的写法

​ ③尽量用union all代替union union会多一次过滤,效率低

​ ④避免在where子句中对字段进行表达式操作

​ ⑤Join优化 能用innerjoin 就不用left join right join,如必须使用 一定要以小表为驱动, 内连接会对两个表进行优化,优先把小表放到外边,把大表放到里 边。left join 或 right join,不会重新调整顺序

4、主从复制、读写分离

​ 如果数据库的使用场景读的操作比较多的时候,为了避免写的操作所造成的性能影响 可以采用读写分离的架构。

​ 读写分离解决的是,数据库的写入,影响了查询的效率。

5、分库分表

小总结

谈一谈你对sql的优化的经验

  1. 表的设计优化,数据类型的选择

  2. 索引优化,索引创建原则

  3. sql语句优化,避免索引失效,避免使用select * ….

  4. 主从复制、读写分离,不让数据的写入,影响读操作

  5. 分库分表

面试快速答法

在这里插入图片描述

5、事务

事务的特性是什么?可以详细说一下吗?

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求

即这些操作要么同时成功,要么同时失败。ACID原则

比如现在有个转账的业务,张三给李四转账,刚开始每个人都有2000块钱,转完帐之后张三还剩1000,而李四有3000

在这里插入图片描述
在这里插入图片描述

ACID是什么?可以详细说一下吗?

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。

  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。

  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

小总结

  • 原子性( Atomicity )

  • 一致性( Consistency )

  • 隔离性( Isolation )

  • 持久性( Durability )

结合转账案例进行说明

面试快速答法

在这里插入图片描述

6、并发事务

并发事务带来哪些问题?怎么解决这些问题呢?MySQL的默认隔离级别是?

  • 并发事务问题:脏读、不可重复读、幻读

  • 隔离级别:读未提交、读已提交、可重复读、串行化

并发事务问题

问题描述
脏读一个事务读到另外一个事务还没有提交的数据。
不可重复读一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
幻读一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了”幻影”。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

怎么解决并发事务的问题呢?

解决方案:对事务进行隔离

隔离级别脏读不可重复读幻读
Read uncommitted 未提交读
Read committed 读已提交×
Repeatable Read(默认) 可重复读××
Serializable 串行化×××

注意:事务隔离级别越高,数据越安全,但是性能越低。

小总结

并发事务带来哪些问题?怎么解决这些问题呢?MySQL的默认隔离级别是?

并发事务的问题:

①脏读:一个事务读到另外一个事务还没有提交的数据。

②不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同

③幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了”幻影”。

隔离级别:

①READ UNCOMMITTED 未提交读

②READ COMMITTED 读已提交

③REPEATABLE READ 可重复读

④SERIALIZABLE 串行化

面试快速答法

在这里插入图片描述

7、undo log和redo log的区别

先来了解两个概念

  • 缓冲池(buffer pool):主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),以一定频率刷新到磁盘,从而减少磁盘IO,加快处理速度

  • 数据页(page):是InnoDB 存储引擎磁盘管理的最小单元,每个页的大小默认为 16KB。页中存储的是行数据

在这里插入图片描述

redo log

重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性

该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file),前者是在内存中,后者在磁盘中。

当事务提交之后会把所有修改信息都存到该日志文件中, 用于在刷新脏页到磁盘,发生错误时, 进行数据恢复使用。

在这里插入图片描述

undo log

回滚日志,用于记录数据被修改前的信息 , 作用包含两个 : 提供回滚MVCC(多版本并发控制) 。undo log和redo log记录物理日志不一样,它是逻辑日志

  • 可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,

  • 当update一条记录时,它记录一条对应相反的update记录。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。

undo log可以实现事务的一致性和原子性

小总结

undo log和redo log的区别

  • redo log: 记录的是数据页的物理变化,服务宕机可用来同步数据

  • undo log :记录的是逻辑日志,当事务回滚时,通过逆操作恢复原来的数据

  • redo log保证了事务的持久性,undo log保证了事务的原子性和一致性

面试快速答法

在这里插入图片描述

8、MVCC

事务中的隔离性是如何保证的呢?

  • 锁:排他锁(如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁)

  • mvcc : 多版本并发控制

你解释一下MVCC?

全称 Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突

MVCC的具体实现,主要依赖于数据库记录中的 隐式字段、undo log日志、readView

在这里插入图片描述

  • 记录中的隐藏字段

在这里插入图片描述

  • undo log

    回滚日志,在insert、update、delete的时候产生的便于数据回滚的日志。

    当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除。

    而update、delete的时候,产生的undo log日志不仅在回滚时需要,mvcc版本访问也需要,不会立即被删除。

  • lundo log版本链

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

不同事务或相同事务对同一条记录进行修改,会导致该记录的undolog生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录

  • readview

    ReadView(读视图)是 快照读 SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。

    那什么是快照读呢?

    先来了解两个概念

    当前读:读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:select … lock in share mode(共享锁),select … for update、update、insert、delete(排他锁)都是一种当前读。

    快照读:简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。

    • Read Committed:每次select,都生成一个快照读。
    • Repeatable Read:开启事务后第一个select语句才是快照读的地方。

    ReadView中包含了四个核心字段:

    字段含义
    m_ids当前活跃的事务ID集合
    min_trx_id最小活跃事务ID
    max_trx_id预分配事务ID,当前最大事务ID+1(因为事务ID是自增的)
    creator_trx_idReadView创建者的事务ID

在这里插入图片描述

在这里插入图片描述

不同的隔离级别,生成ReadView的时机不同:

  • READ COMMITTED :在事务中每一次执行快照读时生成ReadView。

  • REPEATABLE READ:仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。

RC隔离级别下,在事务中每一次执行快照读时生成ReadView。

在这里插入图片描述

在这里插入图片描述

RR隔离级别下,仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。

在这里插入图片描述

小总结

事务中的隔离性是如何保证的呢?(你解释一下MVCC)

MySQL中的多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突

  • 隐藏字段

①trx_id(事务id),记录每一次操作的事务id,是自增的

②roll_pointer(回滚指针),指向上一个版本的事务版本记录地址

  • undo log

①回滚日志,存储老版本数据

②版本链:多个事务并行操作某一行记录,记录不同事务修改数据的版本,通过roll_pointer指针形成一个链表

  • readView解决的是一个事务查询选择版本的问题

    • 根据readView的匹配规则和当前的一些事务id判断该访问那个版本的数据
    • 不同的隔离级别快照读是不一样的,最终的访问的结果不一样
  • RC :每一次执行快照读时生成ReadView

  • RR:仅在事务中第一次执行快照读时生成ReadView,后续复用

面试快速答法

在这里插入图片描述

9、主从同步

MySQL主从同步原理

在这里插入图片描述

MySQL主从复制的核心就是二进制日志

二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但不包括数据查询(SELECT、SHOW)语句。

在这里插入图片描述

小总结

主从同步原理

MySQL主从复制的核心就是二进制日志binlog(DDL(数据定义语言)语句和 DML(数据操纵语言)语句)

①主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中。

②从库读取主库的二进制日志文件 Binlog ,写入到从库的中继日志 Relay Log 。

③从库重做中继日志中的事件,将改变反映它自己的数据

面试快速答法

在这里插入图片描述

10、分库分表

项目用过分库分表吗

在这里插入图片描述

分库分表的时机:

1,前提,项目业务数据逐渐增多,或业务发展比较迅速 单表的数据量达1000W20G以后

2,优化已解决不了性能问题(主从读写分离、查询索引…)

3,IO瓶颈(磁盘IO、网络IO)、CPU瓶颈(聚合查询、连接数太多)

拆分策略

在这里插入图片描述

垂直拆分

1、垂直分库

在这里插入图片描述

垂直分库:以表为依据,根据业务将不同表拆分到不同库中。

特点:

  1. 按业务对数据分级管理、维护、监控、扩展

  2. 在高并发下,提高磁盘IO和数据量连接数

2、垂直分表

在这里插入图片描述

垂直分表:以字段为依据,根据字段属性将不同字段拆分到不同表中。

特点:

  1. 冷热数据分离

  2. 减少IO过渡争抢,两表互不影响

水平拆分

1、水平分库

在这里插入图片描述

水平分库:将一个库的数据拆分到多个库中。

特点:

  1. 解决了单库大数量,高并发的性能瓶颈问题

  2. 提高了系统的稳定性和可用性

2、水平分表

在这里插入图片描述

水平分表:将一个表的数据拆分到多个表中(可以在同一个库内)。

特点:

  1. 优化单一表数据量过大而产生的性能问题;

  2. 避免IO争抢并减少锁表的几率;

分库分表的策略有哪些

新的问题和新的技术
在这里插入图片描述

分库之后的问题:

  • 分布式事务一致性问题

  • 跨节点关联查询

  • 跨节点分页、排序函数

  • 主键避重

分库分表中间件:

  • sharding-sphere

  • mycat

小总结

你们项目用过分库分表吗

  • 业务介绍
  1. 根据自己简历上的项目,想一个数据量较大业务(请求数多或业务累积大)

  2. 达到了什么样的量级(单表1000万或超过20G)

  • 具体拆分策略
  1. 水平分库,将一个库的数据拆分到多个库中,解决海量数据存储和高并发的问题

  2. 水平分表,解决单表存储和性能的问题

  3. 垂直分库,根据业务进行拆分,高并发下提高磁盘IO和网络连接数

  4. 垂直分表,冷热数据分离,多表互不影响

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/691833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mesh网格数据解析及cesium可视化实现

代码实现运行效果 技术术语 Mesh通常指网络拓扑中的网状结构。在计算机网络中,Mesh是指每个节点都与其他节点相连,形成一个无中心的网状结构。Mesh网络常见于分布式计算、传感器网络、互联网等场景中。另外,在3D计算机图形学中,M…

SSMP整合案例(8) Restful开发表现层接口

之前几篇文章后面 我们的数据层 和 业务层基本就搭好了 然后 我们就要处理表现层 表现层开发 我们就还是用之前讲过的 Restful 然后 用Postman来做我们接口的测试 那话不多说 直接开干 在启动类同目录下创建一个 controller 包 下面创建一个类 叫 BookController BookControl…

5-3图像处理经典案例:椒盐噪声运算处理(matlab程序)

1.简述 椒盐噪声也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。椒盐噪声的成因可能是影像讯号受到突如其来的强烈干…

C++ 基础知识(1)

文章目录 写在前面1、第一个c程序1.1、输入输出及注释1.2、命名空间 2、变量、数组、指针2.1、基本类型2.2、数组与字符串2.3、指针2.4、指针空值2.5、引用 3、判断与循环3.1、if、else3.2、for、while 4、函数与参数4.1、函数与缺省参数4.2、函数重载4.3、内联函数 写在前面 …

什么是云安全访问服务

云安全访问服务(Cloud Secure Access Service,CSAS)是一种网络安全服务,旨在保护云环境下的应用程序和数据。它提供了一种安全访问云应用程序和数据的方式,同时也可以保护云中的敏感信息不被未经授权的用户访问。CSAS包括多种安全功能&#x…

从程序员到架构师——缓存层场景

读缓存 业务场景 如何将十几秒的查询请求优化成毫秒级? 这次项目针对的系统是一个电商系统。每个电商系统都有个商品详情页。一开始这个页面很简单,只包括商品的图片、介绍、规格、评价等。 刚开始,这个页面打开很快,系统运行…

控制台里的神秘代码 \033[

“\033[”这串字符在控制台里有特殊的应用。 在串口工具里&#xff08;如sscom&#xff09;看着是一串字符。 在控制台里却可以改变字体颜色&#xff0c;显示进度条&#xff0c;甚至字符动画。 1 字体控制 #include <stdio.h>int main() {printf("以下是测试文字&…

MM 采购凭证的交货成本 表

如上图的交货成本表再 EKBZ表里面

9.1 I/O模型

目录 I/O基本概念 同步和异步 阻塞和非阻塞 五种I/O模型 五种I/O模型比较 I/O基本概念 I/O即数据的读取&#xff08;接收&#xff09;或写入&#xff08;发送&#xff09;操作 通常用户进程中的一个完整I/O分为两个阶段 用户进程空间<-->内核空间 内核空间<--&…

【GPT】中文通用大模型梳理与测评(C-Eval 、AGIEval、MMLU、SuperCLUE)

文章目录 概述申请后直接使用大模型开源可本地部署 通识数据集测评&#xff08;C-Eval 、AGIEval、MMLU、SuperCLUE&#xff09;自媒体报道SuperCLUE&#xff1a;中文通用大模型综合性基准C-Eval&#xff1a;中英测评&#xff08;清华上交提出&#xff09;当前排名&#xff08;…

【Unity编辑器扩展】(三)PSD转UGUI Prefab, 一键拼UI/同步字体/自动9宫切图(完结篇)

工具效果&#xff1a; 第一步&#xff0c;把psd图层转换为可编辑的节点树&#xff0c;并自动解析UI类型、自动绑定UI子元素&#xff1a; 第二步, 点击“生成UIForm"按钮生成UI预制体 (若有UI类型遗漏可在下拉菜单手动点选UI类型)&#xff1a; 验证一键生成UI效果: 书接上…

微信支付接口常用参数及证书区分

注意&#xff1a;服务商模式下&#xff0c;均是使用服务商的以下信息 1. 证书 1.1商户api证书&#xff08;v2和v3接口都需要使用&#xff09; 1.1.1获取方式&#xff1a; 什么是商户API证书&#xff1f;如何获取商户API证书&#xff1f; &#xff08;商户api证书 &#xff…

【Spring AOP】面向切面编程,面向切面编程是面向对象编程的孪生兄弟嘛?且听我细细道来! ! !

前言: 大家好,我是良辰丫,面向切面编程和面向对象编程是两种几乎不同的编程方式,并不是所谓的孪生兄弟,但是我们可以说面向切面编程是面向对象编程的一种补充和完善,到底是什么意思呢?请跟随良辰的步伐往下瞧! ! !&#x1f48c;&#x1f48c;&#x1f48c; &#x1f9d1;个人主…

机器学习7:特征工程

在传统的软件工程中&#xff0c;核心是代码&#xff0c;然而&#xff0c;在机器学习项目中&#xff0c;重点则是特征——也就是说&#xff0c;开发人员优化模型的方法之一是增加和改进其输入特征。很多时候&#xff0c;优化特征比优化模型带来的增益要大得多。 笔者曾经参与过一…

【初识 Docker | 中级篇】 Docker 中使用 docker-compose 安装 Nacos

文章目录 前言一、安装 docker1、安装docker2、安装docker-compose 二、Nacos 单机安装1.创建配置文件1.1.创建目录1.2.创建nacos-logback.xml1.3.创建application.properties1.4.创建docker-compose.yml 2.nacos数据库表结构3.启动Nacos容器 总结 前言 可以按照以下步骤在 Do…

Text2Video-Zero:Text-to-Image扩散模型是Zero-Shot视频生成器

Text2Video-Zero: Text-to-Image Diffusion Models are Zero-Shot Video Generators Paper: https://arxiv.org/abs/2303.13439 Project: https://github.com/Picsart-AI-Research/Text2Video-Zero 原文链接&#xff1a;Text2Video-Zero:Text-to-Image扩散模型是Zero-Shot视频…

Splashtop 让按需远程支持流程更加流畅

Splashtop 一直采用9位 SOS 会话码的形式为用户提供按需支持&#xff1a; 1、技术员引导最终用户访问网站 sos.splashtop.com&#xff1b; 2、最终用户下载并运行小程序&#xff0c;然后发送9位会话码给技术员。 自2015年 Splashtop SOS 产品推出以来&#xff0c;我们一直采…

PLC数字量与模拟量信号输入/输出接线

西门子S7-1200 具有用于进行计算和测量、闭环回路控制和运动控制的集成技术&#xff0c;是一个功能非常强大的系统&#xff0c;可以实现多种类型的自动化任务。下面分享S7-1200系列数字量与模拟量信号输入/输出接线图给大家。 数字量信号模块输入输出接线 SM 1221 数字量输入…

分布式机器学习(Parameter Server)

分布式机器学习中&#xff0c;参数服务器(Parameter Server)用于管理和共享模型参数&#xff0c;其基本思想是将模型参数存储在一个或多个中央服务器上&#xff0c;并通过网络将这些参数共享给参与训练的各个计算节点。每个计算节点可以从参数服务器中获取当前模型参数&#xf…

高速电路设计系列分享-信号链精度分析(下)

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 在任何设计中&#xff0c;信号链精度分析都可能是一项非常重要的任务&#xff0c;必须充分了解。之前&#xff0c; 我们讨论了在整个信号链累积起来并且最终会影响到转换器的多…