当前位置: 首页 > article >正文

MySQL面试八股文:索引篇

 

索引的定义

索引是数据库中用来加速数据查询的一种数据结构。它可以将数据表中的某一列或多列进行排序,以便快速查找数据,减少数据库的扫描次数,提高查询速度。

索引的优缺点

索引的优点是可以大幅度提高数据查询的速度,尤其是对于大型数据库。同时,索引可以保证数据的唯一性、减少冗余数据,提高数据库的完整性和安全性。然而,索引也有缺点。首先,索引需要占用一定的存储空间,如果建立了太多的索引,可能会占用过多的空间。其次,索引的更新和维护会增加数据库的开销,因此在一些写操作较多的场景下,索引会影响性能。

何时需要建立索引

在一些大型的数据表中,如果需要快速查询某些数据,可以通过建立索引来提高查询速度。通常情况下,对于经常查询、排序、分组的字段需要建立索引,这些字段包括主键、外键、经常用于查询的字段等。需要注意的是,建立索引不是无脑加,应该根据实际情况进行选择,过多的索引会浪费存储空间和影响性能。

何时不需要建立索引

  1. where条件中用不到的字段不适合建立索引
  2. 表记录较少。比如只有几百条数据,没必要加索引。
  3. 需要经常增删改。需要评估是否适合加索引
  4. 参与列计算的列不适合建索引
  5. 区分度不高的字段不适合建立索引,如性别,只有男/女/未知三个值。加了索引,查询效率也不会提高。

索引的数据结构

常见的索引数据结构包括B树索引、B+树索引和Hash索引。其中,B树索引是一种自平衡的多叉树结构,能够快速地查找数据,但是效率并不如B+树索引。B+树索引是一种基于B树的索引结构,相对于B树索引,具有更高的查询效率和更好的存储能力。Hash索引是一种利用哈希函数进行索引的结构,适用于等值查询和查询范围较小的场景,但是不支持范围查询和排序操作。

B+树索引

B+ 树是基于B 树和叶子节点顺序访问指针进行实现,它具有B树的平衡性,并且通过顺序访问指针来提高区间查询的性能。

在 B+ 树中,节点中的 key 从左到右递增排列,如果某个指针的左右相邻 key 分别是 keyi 和 keyi+1,则该指针指向节点的所有 key 大于等于 keyi 且小于等于 keyi+1。

进行查找操作时,首先在根节点进行二分查找,找到key所在的指针,然后递归地在指针所指向的节点进行查找。直到查找到叶子节点,然后在叶子节点上进行二分查找,找出key所对应的数据项。

Hash索引和B+树索引的区别

Hash索引和B+树索引在实现上有很大的区别。Hash索引是通过哈希函数将索引列的值映射到一个哈希表中,然后在哈希表中查找对应的数据。这种方式可以快速定位到数据,但是对于范围查询和排序操作不太友好。而B+树索引是一种多层平衡树结构,可以通过二分查找快速定位到数据。相对于Hash索引,B+树索引支持范围查询和排序操作,适用范围更广。

为什么B+树比B树更适合实现数据库索引?

B+树相对于B树具有更好的存储和查询效率。首先,B+树的非叶子节点不保存数据,只保存关键字,因此可以容纳更多的关键字,从而减少树的高度,提高查询效率。其次,B+树的叶子节点通过指针连接形成了一个有序的链表,可以方便地进行范围查询和排序操作。此外,B+树对于磁盘I/O的利用率也更高,因为B+树每次读取的都是整个节点,相对于B树更加高效。

索引的分类

索引可以根据不同的特征进行分类,常见的分类有聚集索引和非聚集索引、唯一索引和非唯一索引、单列索引和多列索引等。

最左匹配原则

最左匹配原则是指对于复合索引,查询时只能使用从左到右的部分列作为查询条件,不能跳过其中的列。例如,对于索引(a,b,c),只能按照(a)、(a,b)和(a,b,c)的顺序使用,不能仅使用(b,c)或(c)。

聚集索引

聚集索引是一种特殊的索引方式,它的索引顺序与物理顺序一致,即数据按照索引顺序进行存储。聚集索引可以有效地提高数据的查询速度,因为它可以直接定位到数据所在的物理位置。在MySQL中,每个表只能有一个聚集索引,通常是主键索引。

覆盖索引

覆盖索引是指查询语句可以通过索引直接获取所需的数据,而不必访问数据表,从而提高查询效率。例如,对于查询语句SELECT id FROM table WHERE name='abc',如果表中存在(name,id)的复合索引,则查询可以直接在索引上完成,不必访问表中的其他列,从而提高查询速度。

索引的设计原则

在设计索引时,需要考虑以下几个原则:

  • 尽量选择区分度高的列作为索引列,以减少索引的重复率。
  • 尽量选择数据量小的列作为索引列,以减少索引的空间占用。
  • 尽量选择频繁查询的列作为索引列,以提高查询效率。
  • 避免使用过多的索引,因为过多的索引会增加维护成本,并且可能会影响写操作的性能。
  • 对于复合索引,需要根据最左匹配原则选择索引列。
  • 对于聚集索引,通常选择主键作为聚集索引。
  • 对于覆盖索引,需要根据查询语句的需求选择索引列。

索引什么时候会失效?

索引会失效的情况主要包括以下几种:

  • 查询条件中使用了函数或表达式,导致无法使用索引。
  • 查询条件中使用了不等于(<>)操作符或者不在(NOT IN)操作符,也可能导致无法使用索引。
  • 查询条件中使用了模糊匹配操作符(LIKE),如果匹配字符串以通配符开头,也可能导致无法使用索引。
  • 查询条件中使用了OR操作符,如果OR操作符的两侧都有可用的索引,则可以使用索引,否则无法使用索引。
  • 索引列上的数据类型与查询条件的数据类型不一致,导致无法使用索引。
  • 表中数据分布不均匀,导致索引失效。

什么是前缀索引?

前缀索引是指只对索引列的一部分进行索引,从而减少索引的空间占用。例如,对于VARCHAR类型的列,可以只对其前几个字符进行索引。前缀索引的缺点是精度不够高,可能会导致查询结果不准确。

索引下推是什么?

请大家移步Mysql中到底什么是索引下推,一分钟看懂(文末送书)


http://www.kler.cn/news/18091.html

相关文章:

  • 我把Solon打包成了native image,速度快的惊人
  • 【linux的学习与软件安装】
  • 计算机操作系统实验:页面置换算法的实现
  • 充电桩测试设备TK4800充电桩现校仪检定装置
  • MySQL优化二索引使用
  • 信息安全从业人员职业规划(甲方乙方分别说明)
  • 中兴B860AV2.1-T(M)-高安版-当贝纯净桌面线刷固件包
  • Facebook 用户量十分庞大,为什么还使用 MySQL 数据库?
  • IDEA沉浸式编程体验
  • 锁相环技术,单边带信号,信号的调制
  • MySQL数据库之索引
  • 【SpringMVC】三、SpringMVC获取请求参数与域数据共享
  • Ubuntu20.04安装Vtk9.2.6+PCL1.12.1(成功无报错)
  • 使用asp.net core web api创建web后台,并连接和使用Sql Server数据库
  • Flink dataStream,如何开窗,如何进行窗口内计算
  • BM54-三数之和
  • 盲目自学网络安全只会成为脚本小子?
  • Java入门全网最详细 - 从入门到转行
  • MySQL安装配置教程(保姆级,包含环境变量的配置)适合小白
  • 【Java笔试强训 33】
  • 【python脚本系列】python脚本2——PDF转word文档
  • Rosetta从头蛋白抗体设计、结构优化及在药物研发中的应用
  • Grafana 系列-统一展示-1-开篇
  • 本地使用3台centos7虚拟机搭建K8S集群教程
  • 璞华助力“数字人社”,为成都市人社数字化建设提供多方位的产品与技术支持!
  • Chapter4:频率响应法(下)
  • tiechui_lesson01_入口函数和卸载函数
  • MySQL数据库——MySQL存储函数详解
  • Java版本企业电子招投标采购系统源码之项目说明和开发类型源码
  • [面试题] 判断二维空间中一点是否在旋转矩形内部