分享几道关于MySQL索引的重点面试题

 更新时间:2019年05月19日 09:18:24   作者:帅地  
这篇文章主要给大家介绍了几道关于MySQL索引的重点面试题,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

索引是对数据库中一或多个列值的排序,帮助数据库高效获取数据的数据结构

假如我们用类比的方法,数据库中的索引就相当于书籍中的目录一样,当我们想找到书中的摸个知识点,我们可以直接去目录中找而不是在书中每页的找,但是这也抛出了索引的一个缺点,在对数据库修改的时候要修改索引到导致时间变多。

但MySQL 索引你真的懂吗?这几道题带你了解索引的几个重要知识点

1. 什么是最左前缀原则?

以下回答全部是基于MySQL的InnoDB引擎

例如对于下面这一张表

如果我们按照 name 字段来建立索引的话,采用B+树的结构,大概的索引结构如下

如果我们要进行模糊查找,查找name 以“张"开头的所有人的ID,即 sql 语句为

select ID from table where name like '张%'

由于在B+树结构的索引中,索引项是按照索引定义里面出现的字段顺序排序的,索引在查找的时候,可以快速定位到 ID 为 100的张一,然后直接向右遍历所有张开头的人,直到条件不满足为止。

也就是说,我们找到第一个满足条件的人之后,直接向右遍历就可以了,由于索引是有序的,所有满足条件的人都会聚集在一起。

而这种定位到最左边,然后向右遍历寻找,就是我们所说的最左前缀原则。

2. 为什么用 B+ 树做索引而不用哈希表做索引?

1、哈希表是把索引字段映射成对应的哈希码然后再存放在对应的位置,这样的话,如果我们要进行模糊查找的话,显然哈希表这种结构是不支持的,只能遍历这个表。而B+树则可以通过最左前缀原则快速找到对应的数据。

2、如果我们要进行范围查找,例如查找ID为100 ~ 400的人,哈希表同样不支持,只能遍历全表。

3、索引字段通过哈希映射成哈希码,如果很多字段都刚好映射到相同值的哈希码的话,那么形成的索引结构将会是一条很长的链表,这样的话,查找的时间就会大大增加。

3. 主键索引和非主键索引有什么区别?

例如对于下面这个表(其实就是上面的表中增加了一个k字段),且ID是主键。

主键索引和非主键索引的示意图如下:

其中R代表一整行的值。

从图中不难看出,主键索引和非主键索引的区别是:非主键索引的叶子节点存放的是主键的值,而主键索引的叶子节点存放的是整行数据,其中非主键索引也被称为二级索引,而主键索引也被称为聚簇索引。

根据这两种结构我们来进行下查询,看看他们在查询上有什么区别。

1、如果查询语句是 select * from table where ID = 100,即主键查询的方式,则只需要搜索 ID 这棵 B+树。

2、如果查询语句是 select * from table where k = 1,即非主键的查询方式,则先搜索k索引树,得到ID=100,再到ID索引树搜索一次,这个过程也被称为回表。

现在,知道他们的区别了吧?

4. 为什么建议使用主键自增的索引?

对于这颗主键索引的树

如果我们插入 ID = 650 的一行数据,那么直接在最右边插入就可以了

但是如果插入的是 ID = 350 的一行数据,由于 B+ 树是有序的,那么需要将下面的叶子节点进行移动,腾出位置来插入 ID = 350 的数据,这样就会比较消耗时间,如果刚好 R4 所在的数据页已经满了,需要进行页分裂操作,这样会更加糟糕。

但是,如果我们的主键是自增的,每次插入的 ID 都会比前面的大,那么我们每次只需要在后面插入就行, 不需要移动位置、分裂等操作,这样可以提高性能。也就是为什么建议使用主键自增的索引。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

相关文章

  • Mysql获取当前日期的前几天日期的方法

    Mysql获取当前日期的前几天日期的方法

    这篇文章主要介绍了Mysql获取当前日期的前几天日期的方法,本文直接给出实现代码,需要的朋友可以参考下
    2015-03-03
  • MySQL中主键为0与主键自排约束的关系详解(细节)

    MySQL中主键为0与主键自排约束的关系详解(细节)

    这篇文章主要给大家介绍了关于MySQL中主键为0与主键自排约束的关系的相关资料,主要介绍的是其中的一些非常细的细节,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • MySQL查询数据库中某个库、表、索引等所占空间的大小

    MySQL查询数据库中某个库、表、索引等所占空间的大小

    MySQL是一个非常流行的关系型数据库管理系统,它的查询操作是非常强大和灵活的。查询的效率不仅取决于表的大小,而且还取决于索引的大小,本文主要介绍了MySQL查询数据库中某个库、表、索引等所占空间的大小,感兴趣的可以了解一下
    2024-01-01
  • mysql查询表里的重复数据方法

    mysql查询表里的重复数据方法

    这篇文章主要介绍了mysql查询表里的重复数据方法,需要的朋友可以参考下
    2017-05-05
  • MySQL中的case when中对于NULL值判断的坑及解决

    MySQL中的case when中对于NULL值判断的坑及解决

    这篇文章主要介绍了MySQL中的case when中对于NULL值判断的坑及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 解析MySQL的information_schema数据库

    解析MySQL的information_schema数据库

    本篇文章是对MySQL的information_schema数据库进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • navicat 连接Ubuntu虚拟机的mysql的操作方法

    navicat 连接Ubuntu虚拟机的mysql的操作方法

    这篇文章主要介绍了navicat 连接Ubuntu虚拟机的mysql的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • mysql设置远程访问数据库的多种方法

    mysql设置远程访问数据库的多种方法

    最近有一同学问我MySQL无法远程访问怎么呢,但能使用localhost来进行方法,下面脚本之家来给各位介绍一下解决办法,需要的朋友可以参考下
    2013-10-10
  • MySQL数据定义语言DDL的基础语句

    MySQL数据定义语言DDL的基础语句

    这篇文章主要介绍了MySQL数据定义语言DDL的基础语句,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • mysql之查询两个时间段是否有交集的情况

    mysql之查询两个时间段是否有交集的情况

    这篇文章主要介绍了mysql之查询两个时间段是否有交集的情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08

最新评论