MySQL(面试题 - 同类型归纳面试题)

目录

一、MySQL 数据类型

1. 数据库存储日期格式时,如何考虑时区转换问题?

2. Blob和text有什么区别?

3. mysql里记录货币用什么字段类型比较好?

4. MySQL如何获取当前日期?

5. 你们数据库是否支持emoji表情存储,如果不支持,如何操作?

6. varchar(50)中50的涵义

7. mysql中int(20)和char(20)以及varchar(20)的区别

8. 字段为什么要求定义为not null?

9. 如果要存储用户的密码散列,应该使用什么字段进行存储?

10. MySQL中DATETIME和TIMESTAMP的区别

11. MySQL中TEXT数据类型的最大长度

二、关联查询

1. Mysql 的内连接、左连接、右连接有什么区别?(已整合)

2. 什么是内连接、外连接、交叉连接、笛卡尔积呢?

3. 谈谈六种关联查询,使用场景。

4. UNION与UNION ALL的区别?

三、主键问题

1. 如何选择合适的分布式主键方案呢?

2. 数据库自增主键可能遇到什么问题

3. 主键使用自增ID还是UUID,为什么?

4. mysql自增主键用完了怎么办?

四、MySQL架构

1. 说说MySQL 的基础架构图

2. Mysql的binlog有几种录入格式?分别有什么区别?

3. InnoDB引擎的4大特性,了解过吗

五、存储引擎

1. InnoDB与MyISAM的区别

2. InnoDB引擎中的索引策略,了解过吗?

六、索引问题

1. MySQL 索引使用有哪些注意事项呢?

2. 数据库索引的原理,为什么要用 B+树,为什么不用二叉树?

3. 聚集索引与非聚集索引的区别

4. 如何写sql能够有效的使用到复合索引

5. Hash索引和B+树区别是什么?你在设计索引是怎么抉择的?

6. 索引有哪些优缺点?

7. 索引有哪几种类型?

8. 创建索引有什么原则呢?

9. 创建索引的三种方式

10. 百万级别或以上的数据,你是如何删除的?

11. 什么是最左前缀原则?什么是最左匹配原则?

12. B树和B+树的区别,数据库为什么使用B+树而不是B树?

13. 覆盖索引、回表等这些,了解过吗?

14. B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据?

15. 何时使用聚簇索引与非聚簇索引

16. 非聚簇索引一定会回表查询吗?

17. 组合索引是什么?为什么需要注意组合索引中的顺序?

18. 列值为NULL时,查询是否会用到索引?

七、SQL优化

1. SQL优化的一般步骤是什么,怎么看执行计划(explain),如何理解其中各个字段的含义。

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

3. 说一下大表查询的优化方案

4. 关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?

5. 如何优化长难的查询语句?有实战过吗?

6. 优化特定类型的查询语句

7. 谈谈MySQL的Explain

八、锁问题

1. MySQL 遇到过死锁问题吗,你是如何解决的?

2. 在高并发情况下,如何做到安全的修改同一行数据?

3. 数据库的乐观锁和悲观锁

4. select for update有什么含义,会锁表还是锁行还是其他。

5. Mysql中有哪几种锁,列举一下?

6. 隔离级别与锁的关系

7. 按照锁的粒度分,数据库锁有哪些呢?锁机制与InnoDB锁算法

8. 从锁的类别角度讲,MySQL都有哪些锁呢?

9. MySQL中InnoDB引擎的行锁是怎么实现的?

10. 什么是死锁?怎么解决?

11. Mysql一条SQL加锁分析

九、事务

1. 事务的隔离级别有哪些?MySQL的默认隔离级别是什么?

2. 什么是幻读,脏读,不可重复读呢?

3. MySQL事务得四大特性以及实现原理

4. MVCC熟悉吗,它的底层原理?

5. 什么是数据库事务?

6. Innodb的事务实现原理?

7. Innodb的事务与日志的实现方式

十、SQL执行过程

1. 一条SQL语句在MySQL中如何执行的?

2. 一条sql执行过长的时间,你如何优化,从哪些方面入手?

3. 一条Sql的执行顺序?

十一、视图 & 游标 & 存储过程 & 存储函数 & 触发器等

1. 为什么要使用视图?什么是视图?

2. 视图有哪些特点?哪些使用场景?

3. 视图的优点,缺点,讲一下?

4. 什么是游标?

5. 什么是存储过程?有哪些优缺点?

6. 什么是触发器?触发器的使用场景有哪些?

7. MySQL中都有哪些触发器?

十二、分布式问题

1. 说说分库与分表的设计

2. 数据库中间件了解过吗,sharding jdbc,mycat?

3. MYSQL的主从延迟,你怎么解决?

4. 读写分离常见方案?

5. MySQL的复制原理以及流程

6. 你是否做过主从一致性校验,如果有,怎么做的,如果没有,你打算怎么做?

十三、生产实际问题

1. 日常工作中你是怎么优化SQL的?

2. MySQL数据库cpu飙升的话,要怎么处理呢?

3. 500台db,在最快时间之内重启

4. 你是如何监控你们的数据库的?你们的慢日志都是怎么查询的?

十四、其它问题

1. mysql中in和exists的区别

2. MYSQL数据库服务器性能分析的方法命令有哪些?

3. 说一下数据库的三大范式

4. mysql有关权限的表有哪几个呢?

5. 一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录

6. count(1)、count(*) 与 count(列名) 的区别?

7. 超键、候选键、主键、外键分别是什么?

8. SQL 约束有哪几种呢?

9. drop、delete与truncate的区别

10. SQL的生命周期?

11. Mysql驱动程序是什么?

12. 什么是数据库连接池?为什么需要数据库连接池呢?


一、MySQL 数据类型

1. 数据库存储日期格式时,如何考虑时区转换问题?

  • datetime类型适合用来记录数据的原始的创建时间,修改记录中其他字段的值,datetime字段的值不会改

变,除非手动修改它。

  • timestamp类型适合用来记录数据的最后修改时间,只要修改了记录中其他字段的值,timestamp字段的

值都会被自动更新。

如何考虑时区转换问题/看一下这个吧:数据库存储日期格式时,如何考虑时区转换问题?

2. Blob和text有什么区别?

  • Blob用于存储二进制数据,而Text用于存储大字符串。
  • Blob值被视为二进制字符串(字节字符串),它们没有字符集,并且排序和比较基于列值中的字节的数值。
  • text值被视为非二进制字符串(字符字符串)。它们有一个字符集,并根据字符集的排序规则对值进行排

序和比较。

3. mysql里记录货币用什么字段类型比较好?

  • 货币在数据库中MySQL常用Decimal和Numric类型表示,这两种类型被MySQL实现为同样的类型。他们

被用于保存与金钱有关的数据。

  • salary DECIMAL(9,2),9(precision)代表将被用于存储值的总的小数位数,而2(scale)代表将被用于存储

小数点后的位数。存储在salary列中的值的范围是从-9999999.99到9999999.99。

  • DECIMAL和NUMERIC值作为字符串存储,而不是作为二进制浮点数,以便保存那些值的小数精度。

4. MySQL如何获取当前日期?

SELECT CURRENT_DATE();

5. 你们数据库是否支持emoji表情存储,如果不支持,如何操作?

更换字符集utf8-->utf8mb4

6. varchar(50)中50的涵义

  • 字段最多存放 50 个字符
  • 如 varchar(50) 和 varchar(200) 存储 "jay" 字符串所占空间是一样的,后者在排序时会消耗更多内存

7. mysql中int(20)和char(20)以及varchar(20)的区别

  • int(20) 表示字段是int类型,显示长度是 20
  • char(20)表示字段是固定长度字符串,长度为 20
  • varchar(20) 表示字段是可变长度字符串,长度为 20

8. 字段为什么要求定义为not null?

null值会占用更多的字节,并且null有很多坑的。

9. 如果要存储用户的密码散列,应该使用什么字段进行存储?

密码散列,盐,用户身份证号等固定长度的字符串,应该使用char而不是varchar来存储,这样可以节省空间

且提高检索效率。

10. MySQL中DATETIME和TIMESTAMP的区别

存储精度都为秒

区别:

  • DATETIME 的日期范围是 1001——9999 年;TIMESTAMP 的时间范围是 1970——2038 年
  • DATETIME 存储时间与时区无关;TIMESTAMP 存储时间与时区有关,显示的值也依赖于时区
  • DATETIME 的存储空间为 8 字节;TIMESTAMP 的存储空间为 4 字节
  • DATETIME 的默认值为 null;TIMESTAMP 的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP)

11. MySQL中TEXT数据类型的最大长度

  • TINYTEXT:256 bytes
  • TEXT:65,535 bytes(64kb)
  • MEDIUMTEXT:16,777,215 bytes(16MB)
  • LONGTEXT:4,294,967,295 bytes(4GB)

二、关联查询

1. Mysql 的内连接、左连接、右连接有什么区别?(已整合)

  • Inner join 内连接,在两张表进行连接查询时,只保留两张表中完全匹配的结果集
  • left join 在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。
  • right join 在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。

2. 什么是内连接、外连接、交叉连接、笛卡尔积呢?

  • 内连接(inner join):取得两张表中满足存在连接匹配关系的记录。
  • 外连接(outer join):取得两张表中满足存在连接匹配关系的记录,以及某张表(或两张表)中不满足

匹配关系的记录。

  • 交叉连接(cross join):显示两张表所有记录一一对应,没有匹配关系进行筛选,也被称为:笛卡尔积。

3. 谈谈六种关联查询,使用场景。

  • 交叉连接
  • 内连接
  • 外连接
  • 联合查询
  • 全连接
  • 交叉连接

4. UNION与UNION ALL的区别?

1. 显示结果不同

union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果集全部显示出来

2. 对重复结果的处理不同

union all是直接连接,取到的是所有值,记录可能有的重复;union是取唯一值,记录没有重复。

所以union在进行表链接后会筛选掉重复的记录,union all不会去除重复记录。

3. 对排序的处理不同

union会按照字段的顺序进行排序;union all 只是将两个结果集合并后就返回。

结论:从效率上讲,union all要比 union快的多,所以如果确定合并的两个结果集中没有重复且不

需要排序就用Union all。

三、主键问题

1. 如何选择合适的分布式主键方案呢?

  • 数据库自增长序列或字段。
  • UUID。
  • Redis生成ID
  • Twitter的snowflake算法
  • 利用zookeeper生成唯一ID
  • MongoDB的ObjectId

2. 数据库自增主键可能遇到什么问题

  • 使用自增主键对数据库做分库分表,可能出现诸如主键重复等的问题。

解决方案的话,简单点的话可以考虑使用UUID哈

  • 自增主键会产生表锁,从而引发问题
  • 自增主键可能用完问题。

3. 主键使用自增ID还是UUID,为什么?

如果是单机的话,选择自增ID;如果是分布式系统,优先考虑UUID吧,但还是最好自己公司有一套分布式唯

一ID生产方案吧。

  • 自增ID:数据存储空间小,查询效率高。但是如果数据量过大,会超出自增长的值范围,多库合并,也有可

能有问题。

  • uuid:适合大量数据的插入和更新操作,但是它无序的,插入数据效率慢,占用空间大。

4. mysql自增主键用完了怎么办?

自增主键一般用int类型,一般达不到最大值,可以考虑提前分库分表的。

四、MySQL架构

1. 说说MySQL 的基础架构图

Mysql逻辑架构图主要分三层:

  • 第一层负责连接处理,授权认证,安全等等
  • 第二层负责编译并优化SQL
  • 第三层是存储引擎。

2. Mysql的binlog有几种录入格式?分别有什么区别?

有三种格式哈,statement,row和mixed。

  • statement,每一条会修改数据的sql都会记录在binlog中。不需要记录每一行的变化,减少了binlog日

志量,节约了IO,提高性能。由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同

时还有一些使用了函数之类的语句无法被记录复制。

  • row,不记录sql语句上下文相关信息,仅保存哪条记录被修改。记录单元为每一行的改动,基本是可以

全部记下来但是由于很多操作,会导致大量行的改动(比如alter table),因此这种模式的文件保存的信息

太多,日志量太大。

  • mixed,一种折中的方案,普通操作使用statement记录,当无法使用statement的时候使用row。

3. InnoDB引擎的4大特性,了解过吗

  • 插入缓冲(insert buffer)
  • 二次写(double write)
  • 自适应哈希索引(ahi)
  • 预读(read ahead)

五、存储引擎

1. InnoDB与MyISAM的区别

  • InnoDB支持事务,MyISAM不支持事务
  • InnoDB支持外键,MyISAM不支持外键
  • InnoDB 支持 MVCC(多版本并发控制),MyISAM 不支持
  • select count(*) from table时,MyISAM更快,因为它有一个变量保存了整个表的总行数,可以直接读取,InnoDB就需要全表扫描。
  • Innodb不支持全文索引,而MyISAM支持全文索引(5.7以后的InnoDB也支持全文索引)
  • InnoDB支持表、行级锁,而MyISAM支持表级锁。
  • InnoDB表必须有主键,而MyISAM可以没有主键
  • Innodb表需要更多的内存和存储,而MyISAM可被压缩,存储空间较小,。
  • Innodb按主键大小有序插入,MyISAM记录插入顺序是,按记录插入顺序保存。
  • InnoDB 存储引擎提供了具有提交、回滚、崩溃恢复能力的事务安全,与 MyISAM 比 InnoDB 写的效率差一些,并且会占用更多的磁盘空间以保留数据和索引

2. InnoDB引擎中的索引策略,了解过吗?

  • 覆盖索引
  • 最左前缀原则
  • 索引下推

索引下推优化是 MySQL 5.6 引入的, 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不

满足条件的记录,减少回表次数。

这篇文章非常不错,大家去看一下吧:聊一聊 InnoDB 引擎中的这些索引策略

六、索引问题

1. MySQL 索引使用有哪些注意事项呢?

可以从三个维度回答这个问题:索引哪些情况会失效,索引不适合哪些场景,索引规则

索引哪些情况会失效

  • 查询条件包含or,可能导致索引失效
  • 如何字段类型是字符串,where时一定用引号括起来,否则索引失效
  • like通配符可能导致索引失效。
  • 联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。
  • 在索引列上使用mysql的内置函数,索引失效。
  • 对索引列运算(如,+、-、*、/),索引失效。
  • 索引字段上使用(!= 或者 < >,not in)时,可能会导致索引失效。
  • 索引字段上使用is null, is not null,可能导致索引失效。
  • 左连接查询或者右连接查询查询关联的字段编码格式不一样,可能导致索引失效。
  • mysql估计使用全表扫描要比使用索引快,则不使用索引。

后端程序员必备:索引失效的十大杂症

索引不适合哪些场景

  • 数据量少的不适合加索引
  • 更新比较频繁的也不适合加索引
  • 区分度低的字段不适合加索引(如性别)

索引的一些潜规则

  • 覆盖索引
  • 回表
  • 索引数据结构(B+树)
  • 最左前缀原则
  • 索引下推

2. 数据库索引的原理,为什么要用 B+树,为什么不用二叉树?

可以从几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数,为什么不

是二叉树,为什么不是平衡二叉树,为什么不是B树,而偏偏是B+树呢?

为什么不是一般二叉树?

如果二叉树特殊化为一个链表,相当于全表扫描。平衡二叉树相比于二叉查找树来说,查找效率更稳定,总体

的查找速度也更快。

为什么不是平衡二叉树呢?

我们知道,在内存比在磁盘的数据,查询效率快得多。如果树这种数据结构作为索引,那我们每查找一次数据

就需要从磁盘中读取一个节点,也就是我们说的一个磁盘块,但是平衡二叉树可是每个节点只存储一个键值和

数据的,如果是B树,可以存储更多的节点数据,树的高度也会降低,因此读取磁盘的次数就降下来啦,查询

效率就快啦。

那为什么不是B树而是B+树呢?

  1. B+树非叶子节点上是不存储数据的,仅存储键值,而B树节点中不仅存储键值,也会存储数据。innodb中

页的默认大小是16KB,如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点树)

就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的IO次数有会再次减少,数据查询的效率也

会更快。

  1. B+树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的,链表连着的。那么B+树使得范围

查找,排序查找,分组查找以及去重查找变得异常简单。

可以看这篇文章哈:再有人问你为什么MySQL用B+树做索引,就把这篇文章发给她

3. 聚集索引与非聚集索引的区别

  • 一个表中只能拥有一个聚集索引,而非聚集索引一个表可以存在多个。
  • 聚集索引,索引中键值的逻辑顺序决定了表中相应行的物理顺序;非聚集索引,索引中索引的逻辑顺序与

磁盘上行的物理存储顺序不同。

  • 索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非

聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。

  • 聚集索引:物理存储按照索引排序;非聚集索引:物理存储不按照索引排序;

何时使用聚集索引或非聚集索引?

4. 如何写sql能够有效的使用到复合索引

复合索引,也叫组合索引,用户可以在多个列上建立索引,这种索引叫做复合索引。

当我们创建一个组合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是

最左匹配原则。

select * from table where k1=A AND k2=B AND k3=D

有关于复合索引,我们需要关注查询Sql条件的顺序,确保最左匹配原则有效,同时可以删除不必要的冗余索

引。

5. Hash索引和B+树区别是什么?你在设计索引是怎么抉择的?

  • B+树可以进行范围查询,Hash索引不能。
  • B+树支持联合索引的最左侧原则,Hash索引不支持。
  • B+树支持order by排序,Hash索引不支持。
  • Hash索引在等值查询上比B+树效率更高。
  • B+树使用like 进行模糊查询的时候,like后面(比如%开头)的话可以起到优化的作用,Hash索引根本无

法进行模糊查询。

6. 索引有哪些优缺点?

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodingW丨编程之路

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值