八股文之MySQL篇

本文介绍了MySQL中的DQL、DML和DDL执行顺序,讲解了SQL的执行流程,重点讨论了索引的原理、类型以及优化方法,包括B+树和回表查询。还涵盖了慢查询的定位和优化,事务的特性、隔离级别以及并发问题。最后提到了MySQL主从同步和分库分表策略。

前言

数据库中我们开发生产中是必需的,而MySQL是大多数公司的首选关系型数据库,这一篇开始介绍MySQL相关的面试题,并且给出相应的回答。

DQL(数据查询语言)的执行顺序

  1. FROM
  2. WHERE
  3. GROUP BY (无法用到SELECT中的别名)
  4. HAVING
  5. SELECT
  6. ORDER BY (可以用到SELECT中的别名)
  7. LIMIT

DML(数据修改语言)

  1. INSERT INTO
  2. UPDATE,SET
  3. DELETE FROM

DDL(数据定义语言)

  1. CREATE TABLE / INDEX / DATABASE
  2. DROP TABLE / INDEX / DATABASE
  3. ALERT TABLE
  4. RENAME TABLE / DATABASE

一条 SQL 是如何在 MySQL 中运行的 / 执行流程

  1. 语法解析
  2. 语义分析
  3. 查询优化,根据SQL的复杂性,表索引等因素来生成一个执行计划
  4. 生成执行计划
  5. 执行查询
  6. 返回结果

MySQL 中的函数

常见多行函数:

  1. IF:相当于Java中的 IF ELSE
  2. CASE:相当于Java中的 IF ELSE IF … ELSE
  3. IFNULL:不为 NULL 返回第一个值,为 NULL 返回第二个值
  4. CONCAT:字符串连接函数
  5. IN:值得注意的是,IN 函数的参数个数是有限制的,大概在一百万左右
  6. DATE_FORMAT:日期格式化函数,注意日期格式是: %Y年 %m月 %d日 %H时 %i分 %s秒
  7. SUBSTRING:截取字符串

单行 / 分组 / 聚集函数:

  1. MAX
  2. MIN
  3. COUNT
  4. SUM
  5. AVG

如何定位慢查询

  • 慢查询顾名思义,就是一条SQL执行的时间很长,所以它慢嘛,在面试中,我们应该结合相关的场景,讲出该场景中所涉及的接口,它在测试的时候响应的就很慢,后续我们排查到的原因就是慢查询
  • 还可以讲在系统中当时采用了运维工具(Skywalking),这个工具可以检测出是哪个接口,因为它呈现的方式非常直观,以图表的方式给出,一眼就可以看出哪些是耗时的接口,再去排查SQL的问题
  • 最后一个就是MySQL自带慢查询功能,MySQL在设计的时候就考虑到了这一点,非常的哇塞,我们开启这个功能也很简单,在配置文件my.ini(如果安装的时候不做特殊处理,配置文件的位置是固定的,直接在Linux中打开配置文件)中开启配置选项:slow-query-log=1long_query_time=2即可,前者是开启慢查询日志记录,后者是慢查询时间的阈值,超过这个时间的SQL,会被记录到慢查询日志文件中,后续进行排查即可,但一般在生产环境中不会开启该功能,因为会消耗一定的性能

如何优化或分析慢查询

采用MySQL自带的分析命令:explain 或 desc(两者功能相同)

  • 通过查看key和key_len字段检查是否命中了索引(索引本身存在是否有失效的情况)
  • 通过type字段查看sql是否有进一步的优化空间,是否存在全索引(索引树扫描) index 或全盘扫描 all
  • 通过extra建议判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复
引用中提到,在MySQL中,一条SQL语句的执行过程通常包括以下几个步骤:权限判断、存储引擎选择和SQL语句执行。首先,MySQL会检查当前用户对于执行该SQL语句的权限,确保用户有足够的权限执行该操作。接下来,MySQL会根据表的存储引擎类型选择相应的执行方式,例如,InnoDB和MyISAM等存储引擎可能会采用不同的执行策略。最后,MySQL会执行SQL语句,根据具体的操作进行数据的读取、写入或修改。 另外,引用中提到了MySQL中的三个重要的日志文件:binlog、redolog和undolog。这些日志文件记录了数据库的操作历史,用于保证数据库的一致性和持久性。binlog是二进制日志,记录了对数据库进行的所有更改操作,可以用于恢复数据或复制数据。redolog是重做日志,用于记录正在进行的事务的修改操作,以便在系统崩溃时进行恢复。undolog是回滚日志,用于记录正在进行的事务的撤销操作,用于实现事务的原子性。 此外,引用中提到了MySQL中varchar和char的区别。varchar是可变长度的字符类型,它可以存储不同长度的字符串,而char是固定长度的字符类型,它会占用固定的存储空间。在定义字段时,如果使用varchar(5),表示该字段最多可以存储5个字符的字符串,而varchar(200)表示该字段最多可以存储200个字符的字符串。这意味着在实际存储数据时,varchar会根据实际字符串的长度占用不同的存储空间,而char则始终占用固定的存储空间。 综上所述,mysql数据库八股文包括SQL语句的执行过程、日志文件的作用以及varchar和char的区别。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【八股文Mysql](https://blog.csdn.net/weixin_45325628/article/details/122930369)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值