本篇总结的是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的区别?
答:union和union all的作用都是将两个结果集合并到一起。
union会对结果去重并排序;union all直接直接返回合并后的结果,不去重也不进行排序;union all的性能比union性能好;
3、什么是临时表,什么时候会使用到临时表,什么时候删除临时表?
答:MySQL在执行SQL语句的时候会临时创建一些存储中间结果集的表,这种表被称为临时表,临时表只对当前连接可见,在连接关闭后,临时表会被删除并释放空间。
临时表主要分为内存临时表和磁盘临时表两种:
- 内存临时表使用的是MEMORY存储引擎;
- 磁盘临时表使用的是MyISAM存储引擎;
一般在以下几种情况中会使用到临时表:
FROM中的子查询DISTINCT查询并加上ORDER BYORDER BY和GROUP 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”表示将日志存入数据库。
如何对慢查询进行优化?
- 分析语句的执行计划,查看SQL语句的索引是否命中。
- 优化数据库的结构,将字段很多的表分解成多个表,或者考虑建立中间表。
- 优化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有有几种录入格式?分别有什么区别?
有三种格式,statement,row和mixed:
statement级别下,每一条会修改数据的sql都会记录在binlog中。 - 不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。
- 由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息。
- 还有一些使用了函数之类的语句无法被记录复制。
row级别下,不记录sql语句上下文相关信息,仅保存哪条记录被修改。 - 记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作会导致大量行的改动(比如altertable)。
- 因此这种模式的文件保存的信息太多,日志量太大。
mixed级别,一种折中的方案,普通操作使用statement记录,当无法使用statement的时候使用row。
此外,新版的MySQL中对row级别也做了一些优化,当表结构发生变化的时候,会记录语句而不是逐行记录。