【备战面试】MySQL基础(二)
创始人
2025-05-28 10:33:57
0

本篇总结的是MySQL知识相关的面试题,后续也会更新其他相关内容

文章目录

  • 1、drop、delete和truncate的区别?
  • 2、UNION和UNION ALL的区别?
  • 3、什么是临时表,什么时候会使用到临时表,什么时候删除临时表?
  • 4、大表数据查询如何进行优化?
  • 5、为什么要设置主键?
  • 6、了解慢查询日志吗?统计过慢查询吗?对慢查询如何优化?
  • 7、主键一般用自增ID还是UUID?
  • 8、字段为什么要设置成NOT NULL?
  • 9、MySQL的binlog有有几种录入格式?分别有什么区别?


1、drop、delete和truncate的区别?

答:区别如下:
在这里插入图片描述

一般来讲:

  • 删除整个表,使用drop;
  • 删除表的部分数据使用delete;
  • 保留表结构删除表的全部数据使用truncate;

2、UNION和UNION ALL的区别?

答:unionunion all的作用都是将两个结果集合并到一起。

  • union会对结果去重并排序
  • union all直接直接返回合并后的结果,不去重也不进行排序
  • union all性能union性能好;

3、什么是临时表,什么时候会使用到临时表,什么时候删除临时表?

答:MySQL在执行SQL语句的时候会临时创建一些存储中间结果集的表,这种表被称为临时表,临时表只对当前连接可见,在连接关闭后,临时表会被删除并释放空间

临时表主要分为内存临时表和磁盘临时表两种:

  • 内存临时表使用的是MEMORY存储引擎
  • 磁盘临时表使用的是MyISAM存储引擎

一般在以下几种情况中会使用到临时表:

  • FROM中的子查询
  • DISTINCT查询并加上ORDER BY
  • ORDER BYGROUP BY子句不一样时会产生临时表
  • UNION查询会产生临时表

4、大表数据查询如何进行优化?

答:

  • 索引优化
  • SQL语句优化
  • 水平拆分
  • 垂直拆分
  • 建立中间表
  • 使用缓存技术
  • 固定长度的表访问起来更快
  • 越小的列访问越快

5、为什么要设置主键?

答:主键是唯一区分表中每一行的唯一标识,如果没有主键,更新或者删除表中特定的行会很困难,因为不能唯一准确地标识某一行。

6、了解慢查询日志吗?统计过慢查询吗?对慢查询如何优化?

答:慢查询日志一般用于记录执行时间超过某个临界值的SQL语句的日志

相关参数

  • slow_query_log:是否开启慢查询日志,1表示开启,0表示关闭。
  • slow_query_log_file:MySQL数据库慢查询日志存储路径
  • long_query_time慢查询阈值,当SQL语句查询时间大于阈值,会被记录在日志上。
  • log_queries_not_using_indexes未使用索引的查询会被记录到慢查询日志中。
  • log_output日志存储方式“FILE”表示将日志存入文件“TABLE”表示将日志存入数据库

如何对慢查询进行优化?

  1. 分析语句的执行计划,查看SQL语句的索引是否命中
  2. 优化数据库的结构,将字段很多的表分解成多个表,或者考虑建立中间表。
  3. 优化LIMIT分页

7、主键一般用自增ID还是UUID?

答:我们先来看一下自增ID与UUID的区别:

自增ID:在设计表时将id字段的值设置为自增的形式。

使用自增ID的好处

  • 字段长度较uuid会很多。
  • 数据库自动编号,按顺序存放利于检索
  • 无需担心主键重复问题。

使用自增ID的缺点

  • 因为是自增,在某些业务场景下,容易被其他人查到业务量
  • 发生数据迁移时,或者表合并时会非常麻烦
  • 高并发的场景下,竞争自增锁降低数据库的吞吐能力

UUID:通用唯一标识码,UUID是基于当前时间、计数器和硬件标识等数据计算生成的。

使用UUID的优点

  • 唯一标识,不会考虑重复问题,在数据拆分、合并时也能达到全局的唯一性
  • 可以在应用层生成提高数据库的吞吐能力
  • 需担心业务量泄露的问题。

使用UUID的缺点

  • 因为UUID是随机生成的,所以会发生随机IO影响插入速度,并且会造成硬盘的使用率较低
  • UUID占用空间较大,建立的索引越多,造成的影响越大。
  • UUID之间比较大小较自增ID慢不少,影响查询速度

最后说下结论:

  • 一般情况MySQL推荐使用自增ID。因为在MySQL的InnoDB存储引擎中,主键索引是一种聚簇索引,主键索引的B+树的叶子节点按照顺序存储了主键值及数据,如果主键索引是自增ID,只需要按顺序往后排列即可,如果是UUID,ID是随机生成的,在数据插入时会造成大量的数据移动产生大量的内存碎片,造成插入性能的下降

8、字段为什么要设置成NOT NULL?

答:首先说一点,NULL和空值是不一样的,空值是不占用空间的,而NULL是占用空间的,所以字段设为NOT NULL后仍然可以插入空值

字段设置成NOT NULL主要有以下几点原因:

  • NULL值影响一些函数的统计,如COUNT,遇到NULL值,这条记录不会统计在内
  • B树不存储NULL,所以索引用不到NULL,会造成第一点中说的统计不到的问题。
  • NOT IN查询在有NULL值的情况下返回的结果都是空值
  • MySQL在进行比较的时候NULL会参与字段的比较,因为NULL是一种比较特殊的数据类型,数据
    库在处理时需要进行特殊处理增加了数据库处理记录的复杂性

9、MySQL的binlog有有几种录入格式?分别有什么区别?

有三种格式,statementrowmixed

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

此外,新版的MySQL中对row级别也做了一些优化,当表结构发生变化的时候,会记录语句而不是逐行记录。

相关内容

热门资讯

哈夫曼编码、哈夫曼树         已知一个文件中出现的各字符及其对应的率如下表所示。若采用定长编码,则该...
Qt QShortCut快捷键... 应用 QShortCut方式的快捷键有好几种使用方式: 1.通过绑定QAction或Q...
律师称两天收到同案相反“判决”... 信阳市平桥区纪委监委5月31日发布情况通报: 近日,网上关于“律师称两天收到同案相反‘判决’”引起网...
Activiti 工作流简介 1、什么是工作流         工作流(Workflow),就是通过计算机对业务流程...
C++类和对象(上) 引入:C语言是面向过程的,关注的是过程,就是分析出解决问题...
gdb调试工具和makemak... gdb调试工具和make/makefile工具 文章目录gdb调试工具和make/makefile工...
【Java】Vert.x使用M... 当初为了学习Docker和自动化运维方面的知识,在家里的机器中也部署了一整套运维工具。...
final与static的区别 都可以修饰类、方法、成员变量。都不能用于修饰构造方法。static 可以修饰类的代码块,...
软件架构Class-3-not... Note 文章目录NoteB/S结构httpservlet & servlet实现httpservl...
【python】pip安装与使... python pip安装与使用一、pip的安装与使用pip介绍pypi仓库pip介绍pip的基础使用...