MySQL索引面试题详细解析
前言
MySQL是关系性数据库中的一种,查询功能强,数据一致性高,数据安全性高,支持二级索引。但性能方面稍逊于非关系性数据库,特别是百万级别以上的数据,很容易出现查询慢的现象。这时候需要分析查询慢的原因,一般情况下是程序员sql写的烂,或者是没有键索引,或者是索引失效等原因导致的。
正文
问题1:什么是数据库索引?
数据库索引是数据库系统中一个重要的概念,索引也叫做key
,是一种用于提升数据库查询效率的数据结构,我们可以把索引理解成一本书的目录,通过目录我们可以快速找到对应章节的内容,同样的,通过数据库索引,我们可以快速找到数据表中对应的记录。
总而言之,索引就像给数据表建了一个目录一样。
问题2:为什么在使用索引?
1 . 使用索引大大减少了存储引擎需要扫描的数据量,如果没有使用索引的话,每查询一行数据都要对数据表进行扫描,这样的话会非常慢。
2 . 由于索引已经排好序的,所以对数据表进行ORDER BY
和GROUP BY
等操作时,可以很快得到结果。
3 . 索引可以将随机的I/O
转为顺序的I/O
,避免高昂的磁盘IO
成本,提升查询效率。
问题3:MySQL索引在哪个模块中实现的?
MySQL
的索引是在存储引擎这一层实现的,因此每一种存储引擎都有不同的实现方式,对同一种索引的处理方式也完成不同。
问题4:为什么设置了索引却不起作用?
如果使用以%
开头的LIKE
语句进行模糊匹配,则无法使用索引,如:
SELECT * FROM users WHERE name LIKE '%小张%';SELECT * FROM users WHERE name LIKE '%小张';
复制代码
不过以%
为结尾则可以使用索引,如:
SELECT * FROM users WHERE name LIKE '张%';
复制代码
OR
语句前后没有同时使用索引,比如下面的语句,字段id
有索引,而字段name
没有创建索引,那么下面的语句只能全表扫描,无法用到索引:
SELECT * FROM users id = 10 or name='test'
复制代码
问题5:MySQL索引底层使用什么数据结构?
在MySQL
中,大部分情况下,索引都是使用B-Tree
作为底层数据结构,B-Tree
只是一种泛称,实际上不同的存储引擎使用B-Tree
时,有不同的变种,比如InnoDB
使用的是B+Tree
。
另外也有一些特殊的索引结构,比如哈希索引,哈希索引底层则使用的是哈希表,在MySQL
中,只有Memory
存储引擎支持哈希索引。
问题6:什么情况下数据表不适合创建索引?
1 . 对于用于存储归档历史数据的且很少用于查询的数据表,不建议创建索引。
2 . 数据量比较小的数据表,而且未来数据也不会有太大增长的数据,不应该建索引,比如用于保存配置的数据表。
3 . 修改频繁,且修改性能远大于查询性能时,不应该再创建索引。
问题7:什么是回表?
回表是对Innodb存储引擎而言的,在InnoDB
存储引擎中,主键索引的叶子节点存储的记录的数据,而普通索引的叶子节点存储的主键索引的地点。
当我们通过主键查询时,只需要搜索主键索引的搜索树,直接可以得到记录的数据。
当我们通过普通索引进行查询时,通过搜索普通索引的搜索树得到主键的地址之后,还要再使用该主键对主键搜索树进行搜索,这个过程称为回表。
问题8:聚簇索引与非聚簇索引的区别?
聚簇索引:聚簇索引的顺序就是数据的物理存储顺序,并且索引与数据放在一块,通过索引可以直接获取数据,一个数据表中仅有一个聚簇索引。
非聚簇索引:索引顺序与数据物理排列顺序无关,索引文件与数据是分开存放。
问题9:MySQL主键索引、唯一索引与普通索引的区别?
设置为主键索引的字段不允许为NULL
,而且一张数据表只能有一个主键索引。
设置为唯一索引的字段,其字段值不允许重要。
普通索引可以包含重复的值,也可以为NULL
。
问题10:索引可以提高查询性能,那是不是索引创建越多越好?
索引作为一个数据表的目录,本身的存储就需要消耗很多的磁盘和内存存储空间。
并助在写入数据表数据时,每次都需要更新索引,所以索引越多,写入就越慢。
尤其是糟糕的索引,建得越多对数据库的性能影响越大。
问题11:MyISAM与InnoDB在处理索引上有什么不同?
MyISAM
存储引擎是非聚族索引,索引与数据是分开存储的,索引文件中记录了数据的指针
而InnoDB
存储引擎是聚族索引,即索引跟数据是放在一块的,InnoDB
一般将主键与数据放在一块,如果没有主键,则将unique key
作为主键,如果没有unique key
,则自动创建一个rowid
作为主键,其他二级索引叶子指针存储的是主键的位置。
问题12:什么是索引的最左前缀原则?
MySQL
数据库不单可以为单个数据列创建索引,也可以为多个数据列创建一个联合索引,比如:
CREATE TABLE test(a INT NOT NOT,b INT NOT NOT,KEY(a,b)
);
复制代码
当我们使用下面的查询语句时,由于WHERE
语句中查询的条件就是联合索引,所以可以很快查询到数据。
SELECT * FROM test WHERE a=1 AND b=1;
复制代码
同样,下面的语句也会利用上面创建的联合索引,这是因为MySQL
会按照索引创建的顺序进行排序,然后根据查询条件从索引最左边开始检测查询条件是否满足该索引,由于字段a
在最左边,所以满足索引。
SELECT * FROM test WHERE a=1;
复制代码
而使用字段b
进行查询时,则为满足,因为从最左边匹配到的是字段a
,所以MySQL
判断为不满足索引条件。
SELECT * FROM test WHERE b=1;
复制代码
从上面例子可以很好地了解索引的最左前缀原则,同时也说明了索引顺序的重要性。
问题13:什么是覆盖索引?
如果一个索引中包含查询所要的字段时,此时不需要再回表查询,我们就称该索引为覆盖索引。
比如下面的查询中,字段id是主键索引,所以可以直接返回索引的值,显著提升了查询的性能。
SELECT id FROM users WHERE id BETWEEN 10 AND 20;
MySQL索引面试题详细解析相关推荐
- MySQL索引面试题六连击
MySQL索引面试题六连击 最近在微信公众号上看到一篇推文,关于MySQL索引面试题的,觉得写得挺好,整理了一下形成博客总结. 原文链接:关于MySQL索引面试题的6连炮!招架的住吗? 1.面试真题 ...
- MySQL索引面试题(2021最新版)
小伙伴们好,我是库森. 今天给大家带来了MySQL索引的常考面试题,看看你能答对多少~ 本文收录于<面试小抄>系列,Github地址(可下载pdf):https://github.com/ ...
- MySQL索引面试题汇总
目录 1.前言 2.索引数据结构分类 3.二叉查找树 4.红黑树(自平衡二叉查找树) 5.B-Tree 6.B+Tree 6.1 B+Tree概述及特点 6.2 B+Tree存放数据示例 6.3 My ...
- 关于MySQL索引面试题的6连炮!招架的住吗?
往期热门文章: 1.<往期精选优秀博文都在这里了!> 2.真香!IDEA 最新版本,支持免打扰和轻量模式! 3.微服务如何防止雪崩?阿里开源之Sentinel限流.熔断来帮你! 4.为什么 ...
- MySQL索引面试题必备
MySQL索引必问面试题 1. 什么是索引 2. 索引分类 3. 索引的基本操作 主键索引的创建 普通索引的创建 唯一索引的创建 复合索引的创建 4. 索引的底层原理 5. 聚簇索引和非聚簇索引 6. ...
- mysql索引面试题
这里写自定义目录标题 mysql索引 mysql索引 名词解析 首先先理清楚一个概念 什么是聚簇索引 什么是非聚簇索引? 聚簇索引 数据和索引在一棵b+树上的叫做聚簇索引,比如innodb的主键索引就 ...
- Mysql索引面试题集锦
1. 索引是什么? 索引是一种数据结构.数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询.更新数据库表中数据.索引的实现通常使用B树及其变种B+树.更通俗的说,索引就相当于目录.为了方 ...
- 配置MYSQL基于GTID 主从复制详细解析及步骤
GTID的概念 全局事务标识:global transaction identifiers GTID是一个事务一一对应,并且全局唯一ID GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或主 ...
- mysql之 binlog维护详细解析(开启、binlog相关参数作用、mysqlbinlog解读、binlog删除)...
binary log 作用:主要实现三个重要的功能:用于复制,用于恢复,用于审计. binary log 相关参数: log_bin 设置此参数表示启用binlog功能,并指定路径名称 log_bin ...
最新文章
- 制作显示欢迎信息的脚本程序
- 何谓服务器托管服务?
- 237. 删除链表中的节点(C语言)
- 动态网络表征学习在推荐领域的创新与实践
- Android清理设备内存具体完整演示样例(二)
- 解决MSChart底部横坐标显示不全的问题
- hibernate oracle查询最大值_Java大数据:Mybatis和Hibernate对比分析
- 视觉SLAM十四讲学习笔记-第三讲-旋转矩阵和Eigen库
- 【渝粤教育】国家开放大学2018年秋季 0014-22T秘书学(一) 参考试题
- 扩展GeoServer数据源
- servlet中的字符编码过滤器的使用
- WIN7(32位)VS2010+openCV 2.4.10+PCL 1.6.0+CUDA 6.5.14+CMake 3.2.1+SSBA-3.0配置
- android集成华为push 6003错误,以及华为低版本crash问题
- 数字图像处理锐化的原理_数字图像锐化的工作原理以及为什么要使用它
- 普通话测试-短文60篇文章,附带拼音(1-10篇)
- 熬夜淦了近 3W 字的 Docker 教程,从入门到精通(建议收藏)
- 教育教学中,为什么需要培养学生的创新思维?
- 【干货】旺季营销婚纱摄影行业这么做广告,转化效果能提高50%!
- 7-10 将输入的字符串中的字符头尾间隔输出
- BlueTooth: 蓝牙基带