面试数据库八股文十问十答第一期

面试数据库八股文十问十答第一期

作者:程序员小白条,个人博客

1.MySQL常见索引、

  • MySQL常见索引有: 主键索引、唯一索引、普通索引、全文索引、组合索引(最左前缀)
  • 主键索引特点:唯一性,非空,自增(如果使用自增主键的话) 、支持快速查询和更新操作。使用场景: 用于经常需要使用单条记录进行查询和更新操作的场景。
  • 唯一索引: 唯一性、可以为空,支持快速查询和更新操作,使用场景:保持列值唯一的场景。
  • 普通索引: 普通索引是最基本的索引类型,可以为空、没有唯一性限制,一个表可以有多个普通索引。使用场景: 支持快速查询和排序操作。
  • 全文索引: 全文索引是用于全文检索的索引类型,特点:支持关键字搜索,不支持模糊搜索,查询较慢,只支持特定的数据类型,例如文本,长文本等,适用于需要对文本数据进行搜索的场景。
  • 组合索引: 将多个列组合在一起创建一个索引,特点:提高查询效率,在多个列需要查询的情况下,组合索引可以避免对表进行全表扫描。优化排序操作,在多个列排序的时候,组合索引优化排序。覆盖索引:如果查询语句中只需要返回组合索引中的列,那么直接从组合索引中获取数据,避免对表进行IO操作。但是要注意组合顺序,通常将区分度高的列放在组合索引的前面。

2.数据库最有效的清理方式

  • 删除不必要的数据,对于不再使用或者过期的数据,可以直接从数据库删除,释放存储空间。
  • 索引维护:定期对索引进行维护可以提高数据库的查询性能,长时间未使用的索引,可以考虑删除或者重新创建。
  • 优化查询语句:提高查询性能和响应速度,查看慢查询日志,explain命令来确定那慢SQL语句需要优化。
  • 定期备份和清理日志:定期备份和清理数据库日志可以避免日志文件过大导致数据库性能下降,可以通过设置合适的日志保留时间和日志轮换机制来清理日志文件。
  • 定期重建表: 定期重建表可以避免表碎片和数据块过多导致数据库性能下降。

3.大表如何进行优化

  • 分区,将大表按照某个条件(比如时间范围)划分成多个子表(本质上还是一个表),提高查询效率和数据插入速度,一般。
  • 索引优化:对频繁使用的字段建立合适的索引,避免全表扫描,同时要主主义避免过多的索引,因为索引会占用磁盘空间带来额外维护成本。
  • 优化SQL语句:避免使用SELECT * 等无用操作,合理使用慢查询日志和Explain语句。
  • 数据库配置优化:合理配置MySQL缓存大小,线程数等。
  • 表结构优化:避免冗余数据,垂直分表和水平分表来分拆大表。
  • 数据分离:大表中频繁被读的数据存储到缓存、CDN等非SQL方式存储技术上,避免频繁SQL交互。

4.水平/垂直分库之后代码要如何修改

  • 数据库连接方式:原本是一个数据库实例,分库之后要连接多个数据库实例,设置主库和从库,设置匹配模式,可以引入MP的dynamic动态数据源,用注解@DS在业务层(service)注明使用的数据源。
  • SQL语句修改:在分库之后,SQL语句的表名和查询条件都需要进行修改。
  • 事务管理: 分库分片后库与库之间的数据依赖关系,事务管理变得更为复杂,需要事务的处理逻辑进行重构。
  • ORM框架:像使用mybatis,jpa,hibernate,需要对配置文件进行修改。
  • 数据迁移: 分库分片之前,需要对数据进行迁移,按照规则分配到不同的数据库。
  • 分布式系统下mysql事务失效怎么办?
  • 1.提前进行系统架构设计中预防,采用读写分离,分库分表,减少mysql事务的压力,避免对个节点同时对同一个数据进行修改操作,降低事务冲突的可能性。
  • 2.在代码逻辑方面,采用乐观锁机制,采用CAS机制,while(true),只要不成功,一直进行重试,避免使用MySQL自带的行级别锁,发现数据冲突,回滚事务并重试。
  • 3.中间件方面,可以引入XA,TCC,保证事务的原子性,一致性和隔离性。
  • 4.消息队列的异步消息处理,每个节点只追踪自己的事务数据,然后将事操作放入队列中,由异步的消息消费者来接进行消费和更新。
  • 5.辅助工具,使用定时任务,对关键的事务数据进行备份、同步操作,以保持数据的一致性和可恢复性。

5.MySQL回表

  • 是什么?MySQL回表指的是在进行索引查询时,需要在主键索引中回溯查找其它列的值的操作,也就是需要再到主键索引的叶子节点中查找该行所对应的记录,并返回记录的所有列。回表一般发生在覆盖索引无法满足查询需求的情况下,例如查询需要的列不在索引列中,或者使用了函数或表达式而无法使用索引覆盖等情况。
  • 回表的影响: 回表的实现需要进行一次根据主键索引的查找,然后再到对应的数据页中读取全部记录,对于大量的数据处理场景,回表操作带来的额外IO负担和延迟影响都是不可忽视的,因此需要避免在高并发、大数据量的场景中进行回表操作。
  • 避免回表操作的一些方法: 1.覆盖索引,将查询的列尽量都加入到索引中,从而避免回表操作。2.查询重构,改写SQL语句来避免回表发生,例如使用联合查询union,避免使用不必要的函数和表达式。

6.水平分表的策略

  • 1.哈希分表,根据主键或其他唯一索引按照哈希算法进行散列,均匀分布到不同的子表中,优点: 实现数据均衡,查询速度快。缺点:新增数据时需要重新计算哈希值并找到对应的字表,可能会导致数据不连续,不利于范围查询。
  • 2.范围分表,根据日期时间,区域,分组等方式进行分表,优点: 很容易执行跨表的范围查询和聚合操作。缺点:在数据分布不均衡时需要重新分配数据。
  • 3.轮询分表,按照一定的规则,进行循环分配到不同的节点。优点:简单易懂,平衡的数据分布。缺点:无法处理数据不均衡的情况。
  • 4.随机分表,将大表随机分配到子表中。优点:简单,使用处理数据比较稳定,而且查询需求没有明显特征的场景。缺点:无法满足数据尽可能均衡的需求。

7.SQL语句怎么进行的优化?(慢查询日志、explain)慢查询日志怎么开启,具体命令,explain怎么分析,看哪些字段,type有哪些类型

  • 优化措施:

    • 对经常查询的字段建立合适的索引
    • 减少不必要的查询,对于前端调用接口返回的字段进行严格筛选,只返回必要的字段。
    • 减少join操作,可以用临时表或者子查询来避免join操作
    • 避免在where子句中使用表达式或者函数,会导致查询条件不能使用索引而导致查询效率下降。
  • 开启慢查询日志命令

    • 首先在MySQL配置my.cnf中添加以下内容,然后重启MySQL服务。
[mysqld]
slow_query_log = 1   
slow_query_log_file = /var/log/mysql/mysql-slow.log 
long_query_time = 1
  • 可以使用以下命令在Linux查看日志

$ sudo tail -f /var/log/mysql/mysql-slow.log

  • 使用 EXPLAIN 命令可以分析 SELECT 查询语句,得到查询执行计划。

  • Explain字段:

    • id: select查询的序列号,查询中执行的顺序
    • select_type: 查询类型,比如Simple简单查询,primary主表查询,subquery子查询,union联合查询。
    • type: 查询使用的索引类型:
      • const 表示通过索引一次就找到了,用于比较unique和primary索引。应用场景:通过主键或者唯一索引等值查询来定位一条数据。
      • eq_ref: 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。应用场景:在进行多表连接查询时,被驱动表通过主键或唯一索引键进行等值查询。
    • img
      • ref: 非唯一性索引扫描,返回匹配某个单独值的所有行。应用场景:普通二级索引等值查询。
    • img
    • 除了唯一索引,我们更多的会使用普通的二级索引。

由于通过二级索引,可能会查询到多个匹配值,相比const性能差那么一点。

MySQL就把这种类型的查询定义为了ref。

在上面我们说到,由于唯一索引可能存在多个null,所以用不了const。

那对于 select * from t2 where key2 is null 来说,不管是唯一索引还是普通索引,其最多用到ref这种类型。

      • range: 一般就是在你的where语句中出现了between、<、>、in等的查询。这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束于另一点,不会扫描全部索引。
      • index: 全索引扫描,index与All区别为index类型只遍历索引树。这通常比All快,因为索引文件通常比数据文件小。(也就是说虽然all和index都是读全表,但index是从索引中读取的,而all是从硬盘中读的)
      • all: 全表扫描,将遍历全表以找到匹配的行。
      • index_subquery: 查询条件包括子查询,并且子查询的列可以通过索引进行等值匹配。
    • img
      • unique_subquery: 查询条件包含子查询,并且子查询的列可以进行主键等值匹配。
    • img
      • index_merge: 查询条件可以命中多个索引的情况
    • img
      • ref_or_null: 命中索引时,查询条件除了等值查询还包含bull值查询。
    • img
    • possible_keys: 可能使用的索引。
    • key:实际使用的索引,如果想要强迫使用可以使用force index,如果想要无视某个索引,可以采用ignore index, 想要建议使用某个索引,可以采用use index。
    • key_len:使用索引列的字节数。
    • rows: mysql估计要读取并检测的行数,并不是结果集里的行数。
    • Extra:额外信息。

8.MySQL的undolog,redolog,binlog

  • undolog用于回滚日志: 每个InnoDB存储引擎的表都有一个单独的undolog,用于记录当前未提交的事务中对该表所做的修改。如果需要执行事务回滚操作,则会使用undolog中的撤销信息进行回滚。一般来说,应用场景不太常见,主要是对于事务出现异常,需要回滚到某一点的场景。
  • redolog用于重做日志: 每个InnoDB存储引擎的表都有一个单独的redolog,用于记录当前未提交的事务中对该表所做的修改,以提高事务的持久性和数据完整性。如果系统崩溃或服务器断电,InnoDB存储引擎可以使用redolog来恢复丢失的事务。一般来说,应用场景是:保证数据的修改是正确的、持久化的,即使数据传输中丢失,也依旧可以通过redo重现。
  • binlog(二进制日志): binlog是用于记录所有对MySQL数据库的更改操作的日志,它是以二进制格式编写的,可以用于恢复数据和复制数据。binlog中的记录可以被用来回滚先前的版本,或者复制到其他MySQL服务器或其他系统中以保持数据的同步和备份。binlog可以配置成追加模式或覆盖模式,追加模式下,新的数据会追加到binlog的末尾,覆盖模式下,会覆盖掉历史的日志记录。一般来说,应用场景常常是用于数据库备份和复制以及数据恢复。

9.数据库ACID,脏读,幻读,不可重复读,四种隔离级别

  • Atomicity:原子性,事务是原子的,一个操作不可分割,要么都失败,要么都成功。
  • Consistency: 一致性,AB互相转账,AB总额不变。
  • Isolation: 隔离性, 多个事务并发访问,事务之间是隔离的,一个事务不应该影响其他事务运行效果。
  • Durability: 持久性,在事务完成提交后,该事务对数据库所作的更改是持久的。
  • 读未提交(Read Uncommitted)最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
  • 读已提交(Read Committed)允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
  • 可重复读(Repeatable Read)对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。select(快照读)不会产生幻读,但对于update(当前读)会产生幻读。
  • 可串行化(Serializable) 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
  • 脏读: 当一个事务读取另一个事务尚未提交的修改(update,insert,delete),产生脏读。
  • 不可重复读: 同一查询在同一事务中多次进行,但由于其他事务已经提交的修改或删除,造成返回不同的结果集。
  • 幻读:同一查询在同一事务中多次进行,由于其他事务已经提交的插入操作,每次返回不同的结果集。

10.数据库MVCC

  • MVCC是什么?全称Multi-Version Concurrency Control,即多版本并发控制,主要是为了提高数据库的并发性能。

  • 特点:MVCC 通过为每个数据行存储多个版本来实现对并发事务的控制。每个版本包含了该数据行在某个时间点的快照信息。在读取数据时,数据库会根据当前事务的时间戳来选择合适的版本,从而避免了数据的锁定和阻塞。

  • 使用场景:MVCC 通常用于多用户并发访问的数据库系统中。在传统的并发控制机制中,如果两个事务同时对同一行进行修改,其中一个事务必须等待另一个事务完成才能进行操作,从而导致性能下降。而 MVCC 可以在不阻塞其他事务的情况下,实现对并发事务的控制。

  • MySQL的InnoDB引擎在Update操作,如果不走索引的情况下,依然锁住整张表。博客地址

  • 为什么要有 MVCC:MVCC 可以避免传统的并发控制机制中的锁定和阻塞问题,提高了并发操作的效率和吞吐量。同时,MVCC 还可以实现可重复读和快照隔离等高级事务特性,提高了数据库的可用性和数据一致性。

  • MVCC用更好的方式去处理读—写请求,做到在发生读—写请求冲突时不用加锁。(这里的读是指快照读,而不是当前读,当前读会加锁,是悲观锁)

  • 以下都是当前读

  • select lock in share mode (共享锁)

  • select for update (排他锁)

  • update (排他锁)

  • insert (排他锁)

  • delete (排他锁)

  • 串行化事务隔离级别

  • 以下是快照读(快照读读到的数据不一定是当前最新的数据,有可能是之前历史版本的数据)

  • 不加锁的select操作(注:事务级别不是串行化)

  • MVCC解决的问题并发读-写时:可以做到读操作不阻塞写操作,同时写操作也不会阻塞读操作。解决脏读、幻读、不可重复读等事务隔离问题,但不能解决上面的写-写 更新丢失问题。

  • 因此有了下面提高并发性能的组合拳:

    • MVCC + 悲观锁:MVCC解决读写冲突,悲观锁解决写写冲突
    • MVCC + 乐观锁:MVCC解决读写冲突,乐观锁解决写写冲突

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

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

相关文章

Ubuntu 安装 MySQL8 配置、授权、备份、远程连接

目录 0100 系统环境0200 下载0300 安装0400 服务管理0401 关闭、启动、重启服务0402 查看服务状态 0500 查看配置文件0600 账号管理0601 添加账号0602 删除账号0603 修改密码0604 忘记root密码 0700 自动备份0800 远程访问 0100 系统环境 [rootlocalhost ~]# cat /proc/versio…

AD生产BOM表时如何隐藏不需要的器件记录

在完成图纸设计号通常需要生产BOM表&#xff0c;以便采购等&#xff0c;如果不做一些操作&#xff0c;往往输出的BOM表中包含一些非需要采购的器件&#xff0c;如下图 这时就需要对原理图或者PCB图做一些处理&#xff0c;以原理图为例&#xff0c;在需要屏蔽的器件上双击&#…

Nginx实现多虚拟主机配置

Nginx实现多虚拟主机配置 Nginx为什么要进行多虚拟主机配置呢&#xff1f;what&#xff1f; Nginx实现多虚拟主机配置的主要原因是&#xff0c;一个服务器可能会承载多个网站或应用程序&#xff0c;这些网站或应用程序需要使用不同的域名或IP地址来进行访问。如果只有一个虚拟…

ctfhub技能树_web_web前置技能_HTTP

目录 一、HTTP协议 1.1、请求方式 1.2、302跳转 1.3、Cookie 1.4、基础认证 1.5、响应包源代码 一、HTTP协议 1.1、请求方式 注&#xff1a;HTTP协议中定义了八种请求方法。这八种都有&#xff1a;1、OPTIONS &#xff1a;返回服务器针对特定资源所支持的HTTP请求方法…

通过查看ThreadLocal的源码进行简单理解

目录 为什么要使用ThreadLocal&#xff1f; 简单案例 ThreadLocal源码分析 断点跟踪 为什么要使用ThreadLocal 在多线程下&#xff0c;如果同时修改公共变量可能会存在线程安全问题&#xff0c;JDK虽然提供了同步锁与Lock等方法给公共访问资源加锁&#xff0c;但在高并发…

力扣 --- H指数

题目描述&#xff1a; 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff…

【HDFS】调试慢节点pipiline ack信息

Client - DN1 - DN2 - DN3 DN3 send ack:[0][d3]。 DN2 send ack: [从dn2入队到收到dn3的ack耗时,0] [d2,d3]。 DN1 send ack: [pkt从dn1入队到收到dn2的ack耗时,pkt从dn2入队到收到dn3的ack耗时,0] [d1,d2,d3]。 Client receive: 就是DN1发送过来数据。 客户端收到的第一个…

【论文笔记】Universal Guidance for Diffusion Models

Abstract 典型的扩散模型经过训练以接受特定形式的条件作用&#xff08;最常见的是文本&#xff09;&#xff0c;并且如果不经过重新训练就不能接受其他形式的条件的作用。 这项工作中提出了一种通用制导算法(universal guidance algorithm)&#xff0c;使扩散模型能够通过任意…

python弹球小游戏

import pygame import random# 游戏窗口大小 WIDTH 800 HEIGHT 600# 定义颜色 WHITE (255, 255, 255) BLACK (0, 0, 0) RED (255, 0, 0) GREEN (0, 255, 0) BLUE (0, 0, 255)# 球的类 class Ball:def __init__(self):self.radius 10self.speed [random.randint(2, 4),…

DELL EMC unity 存储系统日志收集方法

对于一些非简单的硬件故障&#xff0c;解决故障最有效、最快速的方法就是收集日志&#xff0c;而不是瞎搞。常见的乱搞方法就是 1. reimage系统‘ 2. 更换控制器&#xff1b;3&#xff0c; 重启。 本文详细介绍了图形界面GUI和命令行CLI下如何收集DELL EMC Unity日志的方法和常…

Spring Cloud笔记 —— 什么是Spring Cloud?

引言&#xff1a; 在写这篇博客之前&#xff0c;其实吧&#xff0c;博主很久之前有过一段时间的Spring Cloud的案例项目开发经验&#xff0c;就是一个案例项目开发而已&#xff0c;也说不上有多高大上&#xff0c;那个时候&#xff0c;我其实也是从众而已罢了&#xff0c;毕竟现…

LLM;超越记忆《第 2 部分 》

一、说明 在这篇博客中&#xff0c;我深入研究了将大型语言模型&#xff08;LLM&#xff09;提升到基本记忆之上的数学框架。我们探索了动态上下文学习、连续空间插值及其生成能力&#xff0c;揭示了 LLM 如何理解、适应和创新超越传统机器学习模型。 LLM代表了人工智能的重大飞…

基于相关性的四种机器学习聚类方法

在这篇文章中&#xff0c;基于20家公司的股票价格时间序列数据。根据股票价格之间的相关性&#xff0c;看一下对这些公司进行分类的四种不同方式。 苹果&#xff08;AAPL&#xff09;&#xff0c;亚马逊&#xff08;AMZN&#xff09;&#xff0c;Facebook&#xff08;META&…

TCP简介及特性

1. TCP协议简介 TCP是Transmission Control Protocol的简称&#xff0c;中文名是传输控制协议。它是一种面向连接的、可靠的、基于IP的传输层协议。两个TCP应用之间在传输数据的之前必须建立一个TCP连接&#xff0c;TCP采用数据流的形式在网络中传输数据。TCP为了保证报文传输的…

idea汉化

所有的jetbrains 汉化包下载地址&#xff0c; 包括leda &#xff0c;pycharm /&#xff0c;datagrip 等软件&#xff0c;&#xff0c;所有方法都一样&#xff1a;搜索对应的版本需要的包 下载后&#xff0c;在idea的插件中选择从磁盘加载&#xff0c;然后重启 &#xff0c;即可…

循环队列的结构设计和基本操作的实现(初始化,入队,出队,判空,获取长度,清空,销毁)

目录 1.队列的定义 2.循环队列的设计图示 3.循环队列的结构设计 4.循环队列的实现 5.循环队列的总结 1.队列的定义 和栈相反,队列(queue)是一种先进先出(first in first out,缩写为FIFO)的线性表.它只允许在表的一端进行插入,而在另一端删除元素. 在队列中,允许插入的一…

根文件系统构建-busybox中文支持

一. 简介 根文件系统里面就是一堆的可执行文件和其他文件组成的&#xff1f;难道我们得一个一个的从网上去下载这些文件&#xff1f;显然这是不现实的&#xff01;那么有没有人或者组织专门干这个事呢&#xff1f; 他们负责“收集”这些文件&#xff0c;然后将其打包&#xf…

阿里云域名解析到非默认端口处理方式

1.需配置两条解析记录&#xff0c;如下图 2.第一条配置A记录&#xff0c;ip指向部署服务器 3.第二条配置隐形记录&#xff0c;指向第一条的网址&#xff0c;并附带端口号&#xff0c;最终访问第二条的网址就不用带非默认端口号了。 4.最终浏览器访问

[FC][常见Mapper IRQ研究]

本次IRQ研究了如下表所示Mapper的IRQ操作: 卡带名Mapper号VRC373VRC421,23,25VRC624 & 26VRC785MMC34MMC410MMC55Sunsoft FME-769Namco16319Jaleco SS 8800618RAMBO-164 共计11种Mapper的IRQ操作使用例子 代码内有详细注释, 希望能帮助到感兴趣的人. Mapper控制代码(MMC3…

matplotlib学习

显示两个figure 坐标上刻度修改 plt.xlim() 下标范围 plt.xticks() 替换新的下标 图例显示 散点图 subplot多合一显示