MySQL常见面试题汇总(建议收藏!!!)

目录

一、索引相关

(1)什么是索引

索引是一种数据结构,可以帮助我们快速的进行数据的查找。

(2)索引是个什么样的数据结构呢

索引的数据结构和具体存储引擎的实现有关,在 MySQL 中使用较多的索引有 Hash 索引,B+ 树索引等,而我们经常使用的 InnoDB 存储引擎的默认索引实现为:B+ 树索引。

(3)为什么使用索引?

  • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
  • 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
  • 帮助服务器避免排序和临时表。
  • 将随机IO变为顺序IO。
  • 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

(4)Innodb为什么要用自增id作为主键?

如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置, 频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE(optimize table)来重建表并优化填充页面。

(5)Hash 索引和 B+ 树索引有什么区别或者说优劣呢

首先要知道 Hash 索引和 B+ 树索引的底层实现原理:

hash 索引底层就是 hash 表,进行查找时,调用一次 hash 函数就可以获取到相应的键值,之后进行回表查询获得实际数据。B+ 树底层实现是多路平衡查找树。对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据。

那么可以看出他们有以下的不同:

  • hash 索引进行等值查询更快(一般情况下),但是却无法进行范围查询。
    因为在 hash 索引中经过 hash 函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询。而 B+ 树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围。
  • hash 索引不支持使用索引进行排序,原理同上。
  • hash 索引不支持模糊查询以及多列索引的最左前缀匹配。原理也是因为 hash 函数的不可预测。
  • hash索引任何时候都避免不了回表查询数据,而B+树在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询
  • hash 索引虽然在等值查询上较快,但是不稳定。性能不可预测,当某个键值存在大量重复的时候,发生 hash 碰撞,此时效率可能极差。而 B+ 树的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,且树的高度较低。

因此,在大多数情况下,直接选择 B+ 树索引可以获得稳定且较好的查询速度。而不需要使用 hash 索引。

(6)什么是聚簇索引

聚簇索引就是按照每张表的 主键 构造一棵B+树,同时叶子节点中存放的就是整张表的行记录数据。

在 InnoDB 中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引。如果没有唯一键,则MySQL自动为InnoDB表生成一个隐含字段来建立聚簇索引,这个字段长度为6个字节,类型为长整形。

当查询使用聚簇索引时,在对应的叶子节点,可以获取到整行数据,因此不用再次进行回表查询。

(7)说一说索引的底层实现?

### 常见 MySQL 面试题及答案 #### 1. 获取当前 MySQL 版本的方法 为了获取当前使用的 MySQL 数据库版本,可以通过执行如下 SQL 查询命令: ```sql SELECT VERSION(); ``` 这条语句会返回服务器的版本号以及其他有关的信息[^1]。 #### 2. CHAR 和 VARCHAR 类型的区别 `CHAR` 是固定长度字符串类型,而 `VARCHAR` 则是可变长度字符串类型。当定义了一个 `CHAR(10)` 字段并存入少于十个字符的数据时,剩余的空间会被填充为空格;相反地,对于 `VARCHAR(10)` 来说,则只会占用实际所需字节数再加上一个额外字节来保存真实长度。因此,在大多数情况下,如果列的最大可能大小已知且相对较小的话,应该优先考虑使用 `VARCHAR` 而不是 `CHAR`,因为这样可以节省存储空间。 #### 3. 一条 MySQL 语句执行的主要过程 - **客户端发送请求给服务端** - **解析器分析SQL语法结构** - **优化器决定最佳访问路径** - **执行引擎负责具体操作** - **缓存机制提高重复查询效率** 以上就是典型的 MySQL 语句处理流程概述[^2]。 #### 4. 如何区分大小写的比较方式 要在 MySQL 中实现严格区分大小写字母的匹配,可以在查询条件前加上 `BINARY` 关键词或者将待比较的内容包裹在 `BINARY()` 函数内。例如: ```sql -- 方法一:直接在字段名前加 BINARY SELECT * FROM table_name WHERE BINARY column_name = 'value'; -- 方法二:用 BINARY() 包围值 SELECT * FROM table_name WHERE column_name LIKE BINARY ('value'); ``` 这两种方法都可以确保对比时不忽略字母的大写形式差异[^3]。 #### 5. MyISAM 存储引擎的特点 MyISAM 是一种早期非常流行的 MySQL 存储引擎之一,它具有以下特性: - 支持全文索引功能; - 对读密集型应用表现良好; - 表锁定而非行锁定意味着并发更新能力较差; - 缺乏对外键约束的支持; - 更适用于那些只需要简单事务管理的应用程序环境。 尽管如此,由于 InnoDB 成为了默认选项并且提供了更多高级特性的支持,现在 MyISAM 已经逐渐被淘汰了[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值