面试题012-数据库-MySQL(日志+优化)

面试题012-数据库-MySQL(日志+优化)

目录

  • 面试题012-数据库-MySQL(日志+优化)
    • 题目自测
    • 题目答案
      • 1. MySQL中常见的日志有哪些?
      • 2. 慢查询日志有什么用?
      • 3. binlog 主要记录了什么?
      • 4. redo log 如何保证事务的持久性?
      • 5. binlog 和 redo log 有什么区别?
      • 6. 页修改之后为什么不直接刷盘呢?
      • 7. 如何优化SQL查询?
      • 8. 如何分析SQL性能?
      • 9. 读写分离如何实现?
      • 10. 什么是分库分表?
    • 参考资料

题目自测

  • 1. MySQL中常见的日志有哪些?
  • 2. 慢查询日志有什么用?
  • 3. binlog 主要记录了什么?
  • 4. redo log 如何保证事务的持久性?
  • 5. binlog 和 redolog 有什么区别?
  • 6. 页修改之后为什么不直接刷盘呢?
  • 7. 如何优化SQL查询?
  • 8. 如何分析SQL性能?
  • 9. 读写分离如何实现?
  • 10. 为什么要分库分表?

题目答案

1. MySQL中常见的日志有哪些?

答:MySQL中的常见日志包括错误日志、查询日志、慢查询日志、二进制日志、事务日志(包括重做日志和回滚日志)、中继日志等。这些日志在数据库的运行、维护、优化和故障恢复等方面都发挥着重要作用。

  • 错误日志(error log):记录MySQL服务器启动和关闭的详细信息,以及在运行过程中遇到的错误。
  • 查询日志(general query log):记录所有客户端连接和断开连接的信息,以及每一条执行的SQL语句。
  • 慢查询日志(slow query log):记录所有执行时间超过特定时间阈值的查询(默认为 10 秒)。
  • 二进制日志(binary log):记录所有对数据库进行修改的SQL语句,用于数据恢复和主从复制。
  • 事务日志(redo log 和 undo log):redo log重做日志,undo log回滚日志。
  • 中继日志(relay log):在主从复制环境中,从服务器接收并处理主服务器发送的二进制日志事件。

2. 慢查询日志有什么用?

答:慢查询日志记录了所有执行时间超过阈值(long_query_time 默认为10s)的查询,通过分析这些日志找出可以优化的查询语句。

  • 慢查询相关的配置(MySQL配置文件 my.cnf)
    # 用于启用慢查询日志。
    slow_query_log = 1
    # 用于指定慢查询日志文件的路径和名称
    slow_query_log_file = /path/to/your/slow_query.log
    # 置慢查询的时间阈值
    long_query_time = 2
    # 记录那些没有使用索引的查询
    log_queries_not_using_indexes = 1
    

3. binlog 主要记录了什么?

答:binlog主要记录了所有导致数据库中所有数据变更的操作。

  • 记录的主要内容
    • SQL语句:所有执行的DDL语句(CREATE TABLE、ALTER TABLE、DROP TABLE)和DML语句(INSTER、UPDATE、DELETE)这些会改变数据变更等语句。
    • 事务信息:事务的开始和结束标记,以及事务的隔离级别和自动提交状态。

4. redo log 如何保证事务的持久性?

答:redo log 是物理日志,记录了某个数据页的修改,如某个页面某个偏移处修改了几个字节的内容以及被修改的具体内容是什么。每当执行一个事务就会产生这样的一条或者多条物理日志。

  • InnoDB采用写前日志策略(WAL),这意味着在对数据进行修改之前,首先将这些修改记录到redo log中。只有在redo log被成功写入后,才会对实际数据页进行修改。
  • 在事务提交时,只要先将 redo log 持久化到磁盘即可,可以不需要等到将缓存在 Buffer Pool 里的脏页数据持久化到磁盘。
  • 当系统崩溃时,虽然脏页数据没有持久化,但是 redo log 已经持久化,接着 MySQL 重启后,可以根据 redo log 的内容,将所有数据恢复到最新的状态。

5. binlog 和 redo log 有什么区别?

答:binlog是二进制日志,redo log是重做日志。

  • binlog是MySQL的服务层实现的日志,所有引擎都可以使用。redo log是InnoDB引擎特有的。
  • binlog主要用于备份恢复、主从复制。redo log用于保证数据持久性,数据事务级别的数据恢复。
  • binlog是追加写,不会覆盖以前的日志,保存的是全部的日子记录。redo log是循环写,空间大小固定,保存的是未被刷入磁盘的脏页日志。
  • binlog是逻辑日志,主要记录的是数据库执行的所有DDL和DML语句。redo log是物理日志,主要记录的是某个页的修改。

6. 页修改之后为什么不直接刷盘呢?

答:不直接将数据页修改写入磁盘的主要原因是为了提高数据库性能、减少磁盘I/O操作,并通过使用缓冲池和Redo Log等机制确保数据的可靠性和一致性。通过将数据页的修改先写入内存,并在适当的时候批量刷新到磁盘,InnoDB可以在保证数据安全的前提下,显著提升数据库的运行效率。

7. 如何优化SQL查询?

答:优化SQL查询的方式有很多,如使合适索引,优化查询语句,分析执行计划等。

  • 使用合适的索引:
    • 创建索引:在经常用于查询条件的列上创建索引可以显著加快查询速度。
    • 优化索引:确保索引是最新的,并且没有过多的重复或冗余索引。
    • 复合索引:如果查询条件经常涉及多个列,考虑创建包含这些列的复合索引。
  • 优化查询语句:
    • 避免使SELECT*查询:明确列出需要查询的列,可以减少数据传输的量和处理时间。
    • 避免子查询:尽量使用JOIN代替子查询,JOIN的效率更高。
    • 优化JOIN操作:确保JOIN条件中有适当的索引,尽量减少JOIN的表数量。
    • 使用EXISTS代替IN:当处理大数据集时,EXISTS通常比IN更快。
    • 避免全表扫描:在WHERE子句中避免对列使用函数操作,使用通配符开头的LIKE语句,都会导致全表扫描。
  • 使用EXPLAIN:
    • 使用EXPLAIN关键字分析查询计划,了解数据库如何执行查询,以找出潜在的性能瓶颈。

8. 如何分析SQL性能?

答:分析SQL性能的方法有多种,可以通过EXPLAIN分析查询计划、SHOW PROFILE分析执行过程、慢查询日志、以及一些第三方的分析工具。

  • 使用EXPLAIN:执行计划显示了数据库如何解析、优化和执行SQL语句,包括访问哪些表、使用的索引、联接方法等。
  • 使用SHOW PROFILE:该命令可以提供详细的查询执行统计信息,如时间花费在各个阶段的比例,以及执行每个阶段的次数。

9. 读写分离如何实现?

答:实现读写分离的基本思想是将数据库的读取请求分散到多个从属数据库服务器,而写操作仍然集中在主数据库服务器。

  1. 部署多台数据库,选择其中的一台作为主数据库,其他的一台或者多台作为从数据库。
  2. 保证主数据库和从数据库之间的数据是实时同步的,这个过程也就是我们常说的主从复制。
  3. 系统将写请求交给主数据库处理,读请求交给从数据库处理。

10. 什么是分库分表?

答:分库分表是一种数据库设计技术,用于解决单一数据库实例在数据量极大、并发访问极高时面临的性能瓶颈和可扩展性问题。通过将数据分散存储到多个数据库实例或多个表中,可以有效减轻单一数据库或表的负载,提高数据处理的效率和系统的整体性能。

  • 分库:将数据库中的数据分散到不同的数据库上,分为垂直分库和水平分库。
    • 垂直分库:把单一数据库按照业务进行划分,不同的业务使用不同的数据库,进而将一个数据库的压力分担到多个数据库。
    • 水平分库:把同一个表按一定规则拆分到不同的数据库中,每个库可以位于不同的服务器上,这样就实现了水平扩展,解决了单表的存储和性能瓶颈的问题。
  • 分表:对单表的数据进行拆分,可以是垂直拆分,也可以是水平拆分。
    • 垂直分表:对数据表列的拆分,把一张列比较多的表拆分为多张表。
    • 水平分表:对数据表行的拆分,把一张行比较多的表拆分为多张表,可以解决单一表数据量过大的问题。

参考资料

  • JavaGuide
  • 牛客网-Java面试宝典
  • ChatGPT
  • MySQL官网
  • 图解MySQL

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

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

相关文章

pdf格式过大怎么样变小 pdf文件过大如何缩小上传 超实用的简单方法

面对体积庞大的 PDF 文件,我们常常需要寻找有效的方法来缩减其大小。这不仅能够优化存储空间,还能提升文件的传输和打开速度。PDF文件以其稳定性和跨平台兼容性成为工作和学习中的重要文件格式。然而,当我们需要通过邮件发送或上传大文件时&a…

时间序列对于LLM来说并没有什么不同

基础模型推动了计算语言学和计算机视觉领域的最新进展,并在人工智能领域取得了巨大成功。成功的基础模型的关键思想包括: 海量数据:庞大而多样的训练数据涵盖了广泛的分布,使模型能够近似任何潜在的测试分布。 可转移性&#xff…

Ubuntu网络连接图标消失了,没网!!!

文章目录 前言Step1:停止网络管理服务Step2:删除网络管理状态文件Step3:打开网络管理 前言 本次记录的事,有一天心血来潮想烧录一下开发板,却发现自己的Ubuntu系统的网络连接图标消失了,也没网了&#xff…

Docker中安装Kafka和Kafka UI管理界面

Kafka 简介 Apache Kafka 是一个分布式流处理平台,主要用于构建实时数据管道和流应用。它最初由LinkedIn开发,并于2011年开源,之后成为Apache项目的一部分。Kafka的核心概念和功能包括: 发布与订阅消息系统:Kafka允许用户发布和订阅消息流。高吞吐量:Kafka能够处理大量数…

ElasticSearch的应用场景和优势

ElasticSearch是一个开源的分布式搜索和分析引擎,它以其高性能、可扩展性和实时性在多个领域得到了广泛应用。以下是ElasticSearch的主要应用场景和优势: 应用场景 实时搜索: ElasticSearch以其快速、可扩展和实时的特性,成为实…

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 单选题序号5

基础认证题库请移步:HarmonyOS应用开发者基础认证题库 注:有读者反馈,题库的代码块比较多,打开文章时会卡死。所以笔者将题库拆分,以20道题为一组,题库目录如下,读者可以按需跳转。如果对您的阅…

端口port

端口号用来识别计算机中进行通信的应用程序。因此,它也被称为程序地址。 一台计算机上同时可以运行多个程序。传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确地进行数据传输。 总结: IP地址好比每个人的地址&#x…

MMC、EMMC、SD卡、TF卡、SDIO之间的关系

MMC MMC全称Multi-Media Card(多媒体卡)是一种小型可擦除的固态存储卡由西门子及闪迪于1997共同定制与发布的存储标准,‌主要应用于存储MP3、图像等多媒体文件,技术基于东芝的NAND FLASH技术,它是一种接口标准&#x…

volatile锁作用特点及其原理解析

目录 volatile概述 作用: 特点: 对比: 底层原理: volatile如何保证可见性的 volatile如何保证有序性 为什么volatile不保证原子性 volatile概述 volatile可以理解为轻量级的synchronized。但他与synchronized不同&#xf…

数据结构——单链表OJ题(上)

目录 一、移除链表元素 1.思路 2.注意 3.解题 二、反转链表 思路1:三指针翻转法 (1)注意 (2)解题 思路2:头插法 (1)注意 (2)解题 三、链表的中间结…

AWS 中国区同账号0etl integration配置步骤

中国区的AWS支持0etl integration已经一段时间了,目前北京区和宁夏区均支持。中文翻译为零ETL集成。 当前支持的引擎是Aurora MySQL数据托管式导出到Redshift. Global区域支持Aurora PostgreSQL. 中国区后续也会陆续出现此功能的。 功能介绍文档: 【1…

正则表达式的匹配模式有那些?

1、不区分大小写模式(IgnoreCase): 在匹配文本字符串时,不区分文本字符串中的大小写。 在不同编程语言中,此模式的指定方式可能有所不同。例如,在Python中,可以使用常量re.I或re.IGNORECASE&a…

try-catch-finally 捕获异常不在catch里抛出;循环遍历对象生成任务,捕获异常对象不抛出,不影响其他正常对象生成任务

场景:一个模板绑定多个对象,要对每个对象生成任务。捕获生成任务过程中的异常,但是不抛出,只是用日志记录。这样做目的:循环遍历对象生成任务时,异常对象数据生成任务时发生异常只是导致自己生成任务失败&a…

Mac应用快速启动器:Alfred 5 for Mac 激活版

Alfred 5 是一款专为 macOS 系统设计的效率提升工具。这款软件以其快速启动和高效操作功能著称,通过使用快捷键来呼出输入界面,用户可以快速完成各种任务。 最新版本 Alfred 5.5 引入了一些新功能。其中包括整合了 ChatGPT 和 DALL-E,这意味…

YOLOv8不同位置引入RepVGG重参数化

一、原理解析: 复杂的卷积网络大都具有如下缺点: 复杂的多分支设计(如ResNet中的残差相加和Inception中的分支连接)使模型难以实现和自定义,降低了推理速度和降低了内存利用率。一些组件(例如Xception和Mo…

RedisTemplate、StringRedisTemplate、序列化器配置

Lettuce和Jedis RedisTemplate是SpringDataRedis中对JedisApi的高度封装,提供了Redis各种操作、 异常处理及序列化,支持发布订阅。 首先我们要知道SpringData是Spring中数据操作的模块,包括对各种数据库的集成,比如我们之前学过…

Flutter——全网最精致木鱼APP可上架应用市场

研发背景 工作之余,闲来无事,想着研发一款用户可能会经常用到的一款APP,并且能够顺便掌握一下Flutter Material Design 3 UI,所以就有了这款比较精致的木鱼APP的诞生。 开源代码 https://github.com/z244370114/woodenfish