前言

MySQL是关系性数据库中的一种,查询功能强,数据一致性高,数据安全性高,支持二级索引。但性能方面稍逊于非关系性数据库,特别是百万级别以上的数据,很容易出现查询慢的现象。这时候需要分析查询慢的原因,一般情况下是程序员sql写的烂,或者是没有键索引,或者是索引失效等原因导致的。

正文

问题1:什么是数据库索引?

数据库索引是数据库系统中一个重要的概念,索引也叫做key,是一种用于提升数据库查询效率的数据结构,我们可以把索引理解成一本书的目录,通过目录我们可以快速找到对应章节的内容,同样的,通过数据库索引,我们可以快速找到数据表中对应的记录。

总而言之,索引就像给数据表建了一个目录一样。

问题2:为什么在使用索引?

1 . 使用索引大大减少了存储引擎需要扫描的数据量,如果没有使用索引的话,每查询一行数据都要对数据表进行扫描,这样的话会非常慢。

2 . 由于索引已经排好序的,所以对数据表进行ORDER BYGROUP 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索引面试题详细解析相关推荐

  1. MySQL索引面试题六连击

    MySQL索引面试题六连击 最近在微信公众号上看到一篇推文,关于MySQL索引面试题的,觉得写得挺好,整理了一下形成博客总结. 原文链接:关于MySQL索引面试题的6连炮!招架的住吗? 1.面试真题 ...

  2. MySQL索引面试题(2021最新版)

    小伙伴们好,我是库森. 今天给大家带来了MySQL索引的常考面试题,看看你能答对多少~ 本文收录于<面试小抄>系列,Github地址(可下载pdf):https://github.com/ ...

  3. MySQL索引面试题汇总

    目录 1.前言 2.索引数据结构分类 3.二叉查找树 4.红黑树(自平衡二叉查找树) 5.B-Tree 6.B+Tree 6.1 B+Tree概述及特点 6.2 B+Tree存放数据示例 6.3 My ...

  4. 关于MySQL索引面试题的6连炮!招架的住吗?

    往期热门文章: 1.<往期精选优秀博文都在这里了!> 2.真香!IDEA 最新版本,支持免打扰和轻量模式! 3.微服务如何防止雪崩?阿里开源之Sentinel限流.熔断来帮你! 4.为什么 ...

  5. MySQL索引面试题必备

    MySQL索引必问面试题 1. 什么是索引 2. 索引分类 3. 索引的基本操作 主键索引的创建 普通索引的创建 唯一索引的创建 复合索引的创建 4. 索引的底层原理 5. 聚簇索引和非聚簇索引 6. ...

  6. mysql索引面试题

    这里写自定义目录标题 mysql索引 mysql索引 名词解析 首先先理清楚一个概念 什么是聚簇索引 什么是非聚簇索引? 聚簇索引 数据和索引在一棵b+树上的叫做聚簇索引,比如innodb的主键索引就 ...

  7. Mysql索引面试题集锦

    1. 索引是什么? 索引是一种数据结构.数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询.更新数据库表中数据.索引的实现通常使用B树及其变种B+树.更通俗的说,索引就相当于目录.为了方 ...

  8. 配置MYSQL基于GTID 主从复制详细解析及步骤

    GTID的概念 全局事务标识:global transaction identifiers GTID是一个事务一一对应,并且全局唯一ID GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或主 ...

  9. mysql之 binlog维护详细解析(开启、binlog相关参数作用、mysqlbinlog解读、binlog删除)...

    binary log 作用:主要实现三个重要的功能:用于复制,用于恢复,用于审计. binary log 相关参数: log_bin 设置此参数表示启用binlog功能,并指定路径名称 log_bin ...

最新文章

  1. 制作显示欢迎信息的脚本程序
  2. 何谓服务器托管服务?
  3. 237. 删除链表中的节点(C语言)
  4. 动态网络表征学习在推荐领域的创新与实践
  5. Android清理设备内存具体完整演示样例(二)
  6. 解决MSChart底部横坐标显示不全的问题
  7. hibernate oracle查询最大值_Java大数据:Mybatis和Hibernate对比分析
  8. 视觉SLAM十四讲学习笔记-第三讲-旋转矩阵和Eigen库
  9. 【渝粤教育】国家开放大学2018年秋季 0014-22T秘书学(一) 参考试题
  10. 扩展GeoServer数据源
  11. servlet中的字符编码过滤器的使用
  12. WIN7(32位)VS2010+openCV 2.4.10+PCL 1.6.0+CUDA 6.5.14+CMake 3.2.1+SSBA-3.0配置
  13. android集成华为push 6003错误,以及华为低版本crash问题
  14. 数字图像处理锐化的原理_数字图像锐化的工作原理以及为什么要使用它
  15. 普通话测试-短文60篇文章,附带拼音(1-10篇)
  16. 熬夜淦了近 3W 字的 Docker 教程,从入门到精通(建议收藏)
  17. 教育教学中,为什么需要培养学生的创新思维?
  18. 【干货】旺季营销婚纱摄影行业这么做广告,转化效果能提高50%!
  19. 7-10 将输入的字符串中的字符头尾间隔输出
  20. BlueTooth: 蓝牙基带

热门文章

  1. 程序员技术宅万圣节自制“南瓜俄罗斯方块”
  2. SpringBoot手动提交事务
  3. Android扫描银行卡获取银行卡号
  4. Kafka(消息队列原理,kafka定义,Kafka架构原理,kafka架构的工作流程)秒懂的kafka
  5. xargs命令常用参数和常见用法
  6. flutter代码规范配置
  7. 消息称华硕将大规模裁员
  8. 【路由器掉线是怎么回事?】
  9. java中应用多线程实现医院排队
  10. 灵飞经4·西城八部 第十六章 风流云散 2