当前位置: 首页 > news >正文

MySQL面试题——第二篇

1. MySQL的优化手段有哪些?

MySQL的常见的优化手段有以下五种
1. 查询优化

  • 避免select * ,只查询需要的字段。
  • 小表驱动大表,即小的数据集驱动大的数据集,比如当B表的数据集小于A表时,用in优化exist。两表执行顺序是先查B表,在查询A表,查询语句: select * from A where id in(select id from B)。
  • 一些情况下,可以使用连接代替子查询,因为使用join时,MySQL不会在内存中创建临时表。

2. 优化索引的使用

  • 尽量使用主键查询,而非其他索引,因为主键查询不会触发回表查询。
  • 不做列运算,把计算放入业务系统实现。
  • 查询语句尽可能简单,大语句拆小语句,减少锁时间。
  • 不使用select * 查询。
  • or查询改写成in查询
  • 不用函数和触发器
  • 避免使用‘%xx’查询
  • 少用join查询
  • 使用同类型比较,比如‘123’和‘123’、123和123
  • 尽量避免在where子句中使用!=或者<>查询引用会放弃索引而进行全表扫描。
  • 列表数据使用分页查询,每页数据量不要太大。
  • 用exists代替in查询。
  • 避免在索引列上使用is null 和is not null。
  • 尽量使用主键查询
  • 避免在where子句中对字段进行表达式操作。
  • 尽量使用数字型字段,若只包含数值信息的字段尽量不要设计为字符型。

3. 表结构设计优化

  • 使用可以存下数据最小的数据类型。
  • 使用简单的数据类型,int要比varchar类型处理简单。
  • 尽量使用tinyint、smallint、mediumint作为整数类型而非int。
  • 尽可能使用not null定义字段,因为null占用4字节空间。
  • 尽量少用text类型,非用不可时考虑分表。
  • 尽量使用timestamp而非datetime。
  • 单表不要有太多字段,建议在20个字段以内。

4. 表拆分
当数据库中的数据非常大时,查询优化方案也不能解决查询速度慢的问题时,可以考虑拆分表,让每张表的数据量变小,从而提高查询效率。

  • 垂直拆分:把一张列比较多的表拆分为多张表,比如,用户表中一些字段经常被访问,将这些字段放在一张表中,另外一些不常用的字段放在另一张表中。插入数据时,使用事务确保两张表的数据一致性。
  • 水平拆分:表的行数超过200w时,就会变慢,这时可以把一张表的数据拆分成多张表来存放。通常情况下,使用取模的方式进行表的拆分。

读写分离
一般来说,数据库都是读多写少,换言之,数据库的压力多数是因为大量的读取数据操作造成的,我们可以使用数据库集群的方案,使用一个库作为主库,负责写入数据;其他库作为从苦,负责读取数据。

2. 主键使用自增id还是UUID

如果是单机的话,选择自增id;如果是分布式系统,优先考虑UUID,但还是最好有一套分布式唯一ID生产方案。
自增ID:数据存储空间小,查询效率高。但是,不适合分布式场景。
UUID:适合大量数据的插入和更新操作,但是,他是无序的,插入数据效率慢,占用空间大。

3. 如何优化长难的查询语句

  1. 将一个大的查询分为多个小的相同的查询
  2. 减少冗余记录的查询
  3. 一个复杂查询可以考虑拆分成多个简单查询。
  4. 分解关联查询,让缓存的效率更高。

4. 一条SQL执行过长的时间,从哪些方面入手优化

  1. 查看是否涉及多表和子查询,优化SQL结构,去除冗余字段,是否可拆表等。
  2. 优化索引结构,看是否可以适当添加索引
  3. 数量大的表,可以考虑进行 分表
  4. 数据库主从分离,读写分离
  5. explain分析sql语句,查看执行计划,优化SQL
  6. 查看MySQL执行日志,分析是否有其他方面问题。

5. 如果某个表有近千万行数据,CRUD比较慢,如何优化

  1. 分表分库
    某个表有近千万数据,可以考虑优化表结构,分表(水平分表、垂直分表)。
  2. 索引优化

6. 如何删除百万级别或以上的数据

  1. 删除百万数据的时候可以先删除索引
  2. 批量删除其中无用数据
  3. 删除完成后重新添加索引。

7. MySQL有哪些重要的日志文件

1. 错误日志: 用来记录MySQL服务器运行过程中的错误信息
2. 查询日志: 查询日志在MySQL中被称为通用日志,查询日志中记录了数据库执行的所有命令。如果不是在调试环境中,不建议开启查询日志功能,否则日志会非常大,影响MySQL性能。
3. 慢日志: 慢查询会导致CPU、内存消耗过高,当数据库遇到瓶颈时,大部分时间都是由于慢查询导致的。开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句。
4. redo log(重做日志): 为了最大程度的避免数据写入时,因为IO瓶颈造成的性能问题,MySQL采用了一种缓存机制,先将数据写入内存中,再批量把内存中的数据统一刷回磁盘。为了避免将数据刷回磁盘过程中,因为掉电或者系统故障带来的数据丢失,InnoDB采用redo log来解决此问题。
5. undo log(回滚日志):用于存储日志被修改前的值,从而保证如果修改出现异常,可以使用undo log日志来实现回滚。undo log和redo log记录物理日志不一样,他是逻辑日志,可以认为,当delete一条记录时,undo log中会记录一条相反的insert 记录,update一条记录时,记录一条对应的相反的update记录。当执行rollback时,就可以从undolog中的逻辑记录读取到相应的内容并进行回滚。 undo log默认存放在共享表空间中,在MySQL5.6后,undo log存放位置还可以设置在自定义目录。
6. binlog(二进制日志):二进制文件,主要记录所有数据库表结构变更,比如create、alter等,以及表数据修改,比如,insert、update、delete等,binlog中记录了对mysql数据库执行更改的所有操作,并且记录了语句发生时间,执行时长,操作数据等信息。

8. MySQL的binlog有几种格式,分别有什么区别

有三种格式:statement、row和mixed
statement:每一条 会修改数据的SQL 都会记录在binlog中,不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能,由于SQL执行是有上下文的,因此在保存的时候需要保存相关信息,同时,使用了函数之类的语句无法被记录复制。
row:不记录SQL语句上下文相关信息,仅保存哪条记录被修改,记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作,会导致大量行的改动,因此,这种模式的文件保存的信息太多,日志量太大。
mixed:一种折中的方案,普通操作使用statement记录,当无法使用statement的时候使用row。

9. redo log 和binlog有什么区别

redo log 和 binlog 都是MySQL的重要日志,区别如下:

  • redo log是物理日志,记录的是【在某个数据页上做了修改】
  • bin log是逻辑日志,记录的是这个语句的原始逻辑,比如【给ID=2这一行c字段加1】
  • redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用。
    redo log是循环写的,空间固定会用完,binlog是追加写入的,追加写是指binlog文件写到一定大小会切换到下一个,并不会覆盖以前的日志。
    最开始MySQL里没有InnoDB引擎,MySQL自带的引擎是MyISAM,但是MyISAM没有crash-safe能力,binlog只能用于归档,而InnoDB是另一个公司以插件形式引入MySQL的,既然只依靠binlog是没有crash-safe能力的,所以InnoDB使用另外一套日志系统,也就是redo log实现crash-safe。

10. 什么是脏页和干净页

MySQL为了操作的性能优化,把数据更新先放入内存中,之后在统一更新到磁盘,当内存数据和磁盘数据不一致的时候,称这个内存页为脏页;内存数据写到磁盘后,内存的数据和磁盘上的内容就一致了,我们称为【干净页】。

11. 什么情况下会引发MySQL刷脏页的操作

  1. 内存写满了,这个时候就会引发flush操作,对应到InnoDB就是redo log写满了。
  2. 系统内存不足了,当需要新的内存页的时候,就会淘汰一些内存页,如果淘汰的是脏页这个时候就会触发flush操作。
  3. 系统空闲的时候,MySQL会同步内存中的数据到磁盘也会触发flush操作。
  4. MySQL服务关闭的时候也会刷脏页,触发flush操作。

12. MySQL刷脏页很慢可能是什么原因

在MySQL中单独刷一个脏页速度是很快的,如果发现刷脏页速度很慢,说明触发了MySQL刷脏页的【连坐】机制,MySQL【连坐】机制指当MySQL刷脏页的时候如果发现相邻的数据页也是脏页也会一起刷掉,而这个动作会一直蔓延下去。

13.事务执行期间还未提交,如果发生crash,redolog 丢失,是否会导致主备不一致

不会,因为这时候binlog也还在binlog cache里,没发给备库,crash以后redo log和binlog都没有了,从业务角度看这个事务没有提交,所以数据是一致的。

14. 在MySQL中用什么机制来优化随机读/写磁盘对IO的消耗

redo log是用来节省随机写磁盘的IO消耗,而change buffer主要是节省随机读磁盘的IO消耗,redo log会把MySQL的更新操作先记录到内存中,之后统一更新到磁盘,而change buffer是把关键查询数据先加载到内存中,以便优化MySQL 查询。

15. 如何将MySQL的数据恢复到过去某个指定的时间点

例如,今早九点,想把数据恢复成早上六点的状态,这个时候可以先把0点备份的数据库文件,还原到测试库,再从binlog文件中依次取出0:00到6:00的操作信息,重放binlog,就可以完成数据库的还原。

16. 读写分离会带来什么问题?如何解决?

读写分离带来的问题,主要包括 数据一致性问题、延迟问题、负载均衡问题、故障恢复问题
1. 数据一致性问题

  • 问题:由于读写分离会导致数据再不同的数据库副本之间不同步,从而导致读到陈旧数据问题。
  • 解决方法:
    使用主从复制:通过配置异步复制、半同步复制或者全同步复制保证数据及时同步到从库。
    读写分配策略:关键操作从主库读取,非关键数据从从库读取。

2. 延迟问题

  • 问题:主从复制通常存在一定的延迟,特别是在数据写入频繁的场景下,从库的延迟可能会导致读到过期的数据。
  • 解决方法:
    同步复制:虽然会影响性能,但可以确保数据的一致性。
    提高硬件性能:通过提升服务器硬件性能、优化网络带宽和配置高效的存储设备来减少复制延迟。
    优化复制机制:使用增量复制或者并行复制技术加快复制速度。
    3. 负载均衡问题
  • 问题:读写分离后,如何有效的分配读请求到多个从库,确保负载均衡也是一个挑战
  • 解决方法:
    负载均衡器:使用专门的负载均衡器来分配请求。
    数据库代理
    自定义策略
    4. 故障恢复问题
  • 当主库或从库出现故障时,如何迅速恢复。
  • 解决方法
    主从切换:主库故障时,迅速将从库提升为主库。
    自动化运维:使用自动化运维工具来监控和管理主从切换。
    数据备份和恢复:定期进行数据备份,确保数据在故障发生时能够迅速恢复。

17. 主从复制原理是什么

MySQL binlog主要记录了MySQL数据库中数据的所有变化(数据库执行的所有DDL和DML语句),因此,根据主库的MySQL binlog日志就能够将主库的数据同步到从库。
具体流程如下:

  • 主库将数据库中数据的变化写入到binlog。
  • 从库连接主库。
  • 从库会创建一个IO线程向主库请求更新的binlog。
  • 主库会创建一个binlog dump线程发送binlog,从库中的IO线程负责接收。
  • 从库的IO线程将接收的binlog写入到relay log中。
  • 从库的SQL线程读取relay log同步数据到本地。

18. 分库分表会带来什么问题

join操作:同一个数据库中的表分布在了不同的数据库中,导致无法使用join操作,这样就导致需要手动进行数据的封装,比如在一个数据库中查询到数据之后,在根据这个数据去另一个数据库中找对应的数据。
事务问题:单个操作涉及到多个数据库,那么数据库自带的事务就无法满足需求。
分布式ID:需要为不同的数据节点生成全局唯一主键。

相关文章:

MySQL面试题——第二篇

1. MySQL的优化手段有哪些&#xff1f; MySQL的常见的优化手段有以下五种 1. 查询优化 避免select * ,只查询需要的字段。小表驱动大表&#xff0c;即小的数据集驱动大的数据集&#xff0c;比如当B表的数据集小于A表时&#xff0c;用in优化exist。两表执行顺序是先查B表&#x…...

Unity Transform 组件

在 Unity 中&#xff0c;Transform 是一个非常重要的组件&#xff0c;它定义了物体的位置、旋转和缩放&#xff0c;几乎每个 GameObject 都包含一个 Transform 组件。Transform 组件的主要属性如下&#xff1a; 1. position 表示物体在世界空间中的位置。可以通过 transf…...

LeeCode 3. 无重复字符的最长子串

经典方法滑动窗口:(两个指针) 针对这个题我们首先假定两个指针 left 和 right 分别指在数组最左端. 然后两个变量记录长度length和maxlength. 并且因为不能有重复的字符,我们使用HashSet结构来当收集结果的表. 随着右指针不断往右移,左指针和右指针之间的就为截取的字符,而这…...

使用canal.deployer-1.1.7和canal.adapter-1.1.7实现mysql数据同步

1、下载地址 --查看是否开启bin_log日志&#xff0c;value on表示开启 SHOW VARIABLES LIKE log_bin; -- 查看bin_log日志文件 SHOW BINARY LOGS; --查看bin_log写入状态 SHOW MASTER STATUS; --查看bin_log存储格式 row SHOW VARIABLES LIKE binlog_format; --查看数据库服…...

VMware Workstation Pro 17下载及安装教程

下载 好消息&#xff01;从VMware Workstation Pro 17开始&#xff0c;个人可以免费使用了&#xff0c;再也不需要找破解激活码啥的了。 但是坏处却不小&#xff1a;其下载变得异常复杂。首先需要注册账号&#xff0c;外网非常慢很可能注册不上&#xff1b;其次根本找不到下载…...

集采良药:从“天价神药”到低价良药,伊马替尼的真实世界研究!

在医疗科技日新月异的今天&#xff0c;有一种药物以其卓越的疗效和深远的影响力&#xff0c;成为了众多患者心中的“精准武器”——伊马替尼。这款药物不仅在慢性髓细胞白血病&#xff08;CML&#xff09;的治疗上屡创佳绩&#xff0c;更是胃肠道间质瘤&#xff08;GIST&#x…...

00898 互联网软件应用与开发自考复习题

资料来自互联网软件应用与开发大纲 南京航空航天大学 高纲4295和JSP 应用与开发技术(第 3 版) 马建红、李学相 清华大学出版社2019年 第一章 一、选择题 通过Internet发送请求消息和响应消息使用&#xff08;&#xff09;网络协议。 FTP B. TCP/IP C. HTTP D. DNS Web应…...

linux 进程间通信之pthread(条件变量共享和互斥锁共享)

0,互斥锁共享 初始化和销毁mutex互斥锁 int pthread_mutexattr_init(pthread_mutexattr_t *attr); int pthread_mutexattr_destroy(pthread_mutexattr_t *attr); 进程共享属性有两种值: 1、PTHREAD_PROCESS_PRIVATE,这个是默认值(1),同一个进程中的多个线程访问同一个…...

数据结构-2.7.单链表的查找与长度计算

注&#xff1a;本文只探讨"带头结点"的情况(查找思路类似循环找到第i-1 个结点的代码) 一.按位查找&#xff1a; 1.代码演示&#xff1a; 版本一&#xff1a; #include<stdio.h> #include<stdlib.h> ​ ​ //定义单链表结点类型 typedef struct LNo…...

iotop 命令:磁盘IO监控和诊断

一、命令简介 ​iotop​命令用于监视磁盘I/O&#xff0c;实时显示每个进程或线程的读写速率等信息。非常适合用于诊断系统中的I/O瓶颈。 ‍ ​​ ‍ 安装 iotop 在大多数Linux发行版中&#xff0c;iotop​可能不是预装的。可以使用包管理器来安装它。 例如&#xff0c;在…...

解锁编程新境界:GitHub Copilot 让效率翻倍

Number.1&#xff1a;工具介绍 功能特点&#xff1a; 智能代码生成与补全&#xff1a;通过学习大量代码库和开发者的编码风格&#xff0c;能根据上下文自动推断可能的代码补全选项&#xff0c;甚至可以自动完成函数定义、循环结构等复杂代码片段。例如&#xff0c;当编写一个算…...

爱普生相机SD卡格式化后数据恢复指南

我借了朋友的‌爱普生相机&#xff0c;想查看一下内存&#xff0c;哎呀&#xff0c;一不小心按错了&#xff0c;竟然执行了格式化操作&#xff0c;这可真是太让人郁闷了&#xff0c;这还有机会挽救数据吗&#xff1f;心塞&#xff0c;求帮助&#xff01; 随着数码摄影的普及&am…...

【数据结构】排序算法---基数排序

文章目录 1. 定义2. 算法步骤2.1 MSD基数排序2.2 LSD基数排序 3. LSD 基数排序动图演示4. 性质5. 算法分析6. 代码实现C语言PythonJavaCGo 结语 ⚠本节要介绍的不是计数排序 1. 定义 基数排序&#xff08;英语&#xff1a;Radix sort&#xff09;是一种非比较型的排序算法&…...

二叉树(下)

目录 判断树是否相同 判断树是不是另一棵树的子树 二叉树翻转 判断平衡二叉树 二叉树层序遍历 这篇主要提供一些关于二叉树例题的讲解&#xff0c;如果对二叉树及其基本操作有疑问的可以转至&#xff1a; 二叉树&#xff08;上&#xff09;-CSDN博客二叉树&#xff08;中&…...

计算机网络33——文件系统

1、chmod 2、chown 需要有root权限 3、link 链接 4、unlink 创建临时文件&#xff0c;用于非正常退出 5、vi vi可以打开文件夹 ../是向外一个文件夹 6、ls ls 可以加很多路径&#xff0c;路径可以是文件夹&#xff0c;也可以是文件 ---------------------------------…...

算法:76.最小覆盖子串

题目 链接&#xff1a;leetcode链接 思路分析&#xff08;滑动窗口&#xff09; 还是老样子&#xff0c;连续问题&#xff0c;滑动窗口哈希表 令t用的hash表为hash1&#xff0c;s用的hash表为hash2 利用hash表统计窗口内的个字符出现的个数&#xff0c;与hash1进行比较 选…...

DNS服务

一.DNS介绍 DNS应用层协议 Domain Name System 域名系统 作用&#xff1a;实现域名解析&#xff0c;解析主机名所对应的IP地址&#xff0c; 在网络环境中设备与设备之间要想相互通信只能依赖IP地址&#xff0c;DNS服务器的作用是实现域名解析。 如上图所示&#xff0c;DNS存…...

STM32 HAL freertos零基础(九)任务通知

1、任务通知 任务通知用于任务之间同步和通信。任务通知允许一个任务向另一个任务发送一个32位的值,并可以选择是否唤醒正在等待通知的任务。这使得任务之间的同步更加简单和灵活。 任务通知功能: 发送通知:一个任务可以向另一个任务发送一个32位的值。 接收通知:接收任…...

Qt+FFmpeg开发视频播放器笔记(三):音视频流解析封装

音频解析 音频解码是指将压缩的音频数据转换为可以再生的PCM(脉冲编码调制)数据的过程。 FFmpeg音频解码的基本步骤如下: 初始化FFmpeg解码器(4.0版本后可省略): 调用av_register_all()初始化编解码器。 调用avcodec_register_all()注册所有编解码器。 打开输入的音频流:…...

从黎巴嫩电子通信设备爆炸看如何防范网络电子袭击

引言&#xff1a; 在当今数字化时代&#xff0c;电子通信设备已成为我们日常生活中不可或缺的一部分。然而&#xff0c;近期黎巴嫩发生的电子设备爆炸事件提醒我们&#xff0c;这些设备也可能成为危险的武器。本文将深入探讨电子袭击的原理、防范措施&#xff0c;以及网络智能…...

【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL16

使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器 描述 ②请使用2片该优先编码器Ⅰ及必要的逻辑电路实现16线-4线优先编码器。优先编码器Ⅰ的真值表和代码已给出。 可将优先编码器Ⅰ的代码添加到本题答案中&#xff0c;并例化。 优先编码器Ⅰ的代码如下&#xff1a; module…...

12 - TCPServer实验

在上一章节中&#xff0c;我们学习了TCPClient通信测试的相关知识。接下来&#xff0c;本章节将以此为基础&#xff0c;构建一个基础性的TCPServer连接机制&#xff0c;该机制将利用之前所建立的WIFI网络连接。为方便演示&#xff0c;我们将借助网络调试助手工具进行数据的发送…...

Explain执行计划

Explain执行计划 explain可以帮助开发人员分析SQL问题&#xff0c;explain用于显示MySQL如何使用SQL执行计划&#xff0c;可以帮助开发人员写出更优化的查询语句。使用方法就是在查询语句前加上explain关键字。 执行添加上explain关键字的语句可以看到一个列表&#xff1a; 其…...

ARM/Linux嵌入式面经(三六):中科曙光

文章目录 1.AD转换,怎么在项目中运用2.项目中的通信网络介绍一下通信网络介绍1. 通信网络类型2. 通信网络特点3. 应用场景4. 关键技术5. 项目中的具体应用和实现方式模拟面试官追问3.socketSocket介绍深度拓展与追问深度拓展可能的追问4.进程间通信方式进程间通信方式介绍总结…...

Python和C++气候模型算法模型气候学模拟和统计学数据可视化及指标评估

&#x1f3af;要点 贝叶斯推理气候模型辐射对流及干湿能量平衡模型时间空间气象变化预测模型评估统计指标气象预测数据变换天气和气象变化长短期影响预估降低气候信息尺度评估算法气象行为模拟&#xff1a;碳循环、辐射强迫和温度响应温室气体排放碳循环温室诱导气候变化评估气…...

鸿蒙开发城市联动选择弹框

鸿蒙开发城市联动选择弹框 城市联动选择弹框不容易&#xff0c;在Android那边也是不容易。选择某个省份时&#xff0c;城市要对得上&#xff0c;切换得及时 一、思路&#xff1a; 关键用Provide和Consume互相监听对方的变化 二、效果图&#xff1a; 三、视频效果&#xff1…...

css 控制虚线刻度尺寸

文章目录 css效果 css <div style"width: 100%; height: 1px;background-image: linear-gradient(to right, #545454 0%, #545454 80%, transparent 5%);background-size: 15px 10px;background-repeat: repeat-x; margin: 0 auto;"></div>效果...

NLP三天入门大模型,我领先你好几个版本了

大模型时代下&#xff0c;nlp初学者需要怎么入门? 入门姿势简单粗暴:打一些必要的基础就跑步进入Transformera 大模型时代&#xff0c;传统的算法&#xff0c;像分词、词性标注&#xff0c;被替代得非常厉害&#xff0c;在入门阶段没必要花费太多精力在传统算法上面。 数学和…...

专题六_模拟_算法详细总结

目录 模拟算法 1.模拟算法流程&#xff08;一定要在草稿纸上演算一遍流程&#xff09; 2.把流程转换成代码 1. 替换所有的问号&#xff08;easy&#xff09; 解析&#xff1a; 1.暴力&#xff1a; 2.优化&#xff1a;&#xff08;找规律&#xff09; 总结&#xff1a; …...

ArrayList的扩容机制

ArrayList的扩容机制 ArrayList中的成员变量&#xff1a;1.不带参数的构造方法 让elementDate 引用指向 DEFAULTCAPACITY_EMPTY_ELEMENTDATA所指向的对象 > 当我们调用 不带参数的构造方法的时候 第一次进行add元素的时候&#xff0c;会为底层的数组 进行内存的分配&…...