【面试题】MySQL 索引(第二篇)

1.索引

索引是数据库中的一个核心概念,它对于提高数据库查询效率至关重要。以下是索引的详细概念解析:

一、索引的定义

  • 基本定义:索引是一个排序的列表,其中存储着索引的值和包含这些值的数据所在行的物理地址(或逻辑指针)。这类似于书籍的目录,通过目录可以快速定位到书中的具体内容。
  • 物理结构:索引是一个单独的、物理的数据库结构,它是表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

二、索引的作用

  1. 加快查询速度:通过索引,数据库可以快速定位到数据的物理位置,避免了全表扫描,从而大大提高了查询效率。
  2. 保证数据的唯一性:通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
  3. 加速表连接:在进行表连接操作时,索引可以显著减少连接所需的时间,特别是在实现数据的参考完整性方面特别有意义。
  4. 优化排序和分组:在使用ORDER BY和GROUP BY子句进行数据检索时,索引可以显著减少查询中分组和排序的时间。
  5. 使用优化隐藏器:索引可以在查询的过程中使用优化隐藏器,提高系统的整体性能。

三、索引的分类

根据索引的不同特性和用途,可以将索引分为多种类型,包括但不限于以下几种:

  1. 普通索引:最基本的索引类型,没有唯一性之类的限制。它允许表中任何两行具有相同的索引值。
  2. 唯一索引:与普通索引类似,但唯一索引列的每个值都必须是唯一的。唯一索引允许有空值,但如果是用组合索引创建,则列值的组合必须唯一。
  3. 主键索引:一种特殊的唯一索引,它要求表中的每一行都必须有一个唯一的主键值。主键索引不允许有空值,并且一个表只能有一个主键索引。
  4. 聚集索引(聚簇索引):在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。

四、索引的创建和管理

索引可以在创建表时指定,也可以在表创建后通过ALTER TABLE语句添加。此外,还可以使用CREATE INDEX语句直接创建索引。在索引的管理方面,可以通过DROP INDEX语句删除不再需要的索引,以优化数据库的性能和存储空间。

五、索引的注意事项

  • 索引虽然可以提高查询效率,但也会占用额外的存储空间,并可能降低更新表的速度(如插入、删除和更新操作),因为索引也需要随之更新。
  • 在选择索引列时,应优先考虑那些在查询条件中经常出现的列、在连接操作中经常作为连接条件的列、以及经常出现在ORDER BY和GROUP BY子句中的列。
  • 避免在索引列上使用函数或进行类型转换等操作,因为这可能会使索引失效。

综上所述,索引是数据库中的一个重要概念,它通过提供数据的快速访问路径来优化查询性能。然而,在使用索引时也需要权衡其带来的好处和潜在的成本。

2. MySQL中如何创建索引?

在MySQL中,可以使用CREATE INDEX语句来创建索引。例如,要为表的某个列创建索引,可以使用如下命令:

sql复制代码
​
CREATE INDEX index_name ON table_name(column_name);

索引可以显著提高查询性能,但也会占用额外的磁盘空间,并可能影响插入、删除和更新操作的性能。

3.常见的索引有哪些

常见的索引类型可以从不同的角度进行分类,以下是几种常见的索引类型:

一、从索引存储结构划分

  1. B-树索引(BTREE索引):

    • 又称B+树索引,是目前数据库系统中最为常用的索引类型。

    • 它采用B+树数据结构来存储数据,能够支持等值查询、范围查询和前缀查询,并且可以对查询结果进行排序。

    • 叶子节点包含了表中的数据,并且叶子节点之间通过指针相连,从而提高了区间访问的性能。

  2. 哈希索引(HASH索引):

    • 通过哈希算法将索引键转换为哈希值,并存储在哈希表中。

    • 检索时,通过计算查询条件的哈希值来快速定位到数据。

    • 哈希索引适用于等值查询,但不支持范围查询和排序。

    • 在MySQL中,只有MEMORY和HEAP存储引擎支持哈希索引。

  3. 全文索引(FULLTEXT索引):

    • 主要用于在大量文本数据中搜索关键字。

    • 它支持对文本内容进行分词处理,并存储每个词的位置信息,从而能够快速找到包含关键字的文本。

    • 在MySQL中,全文索引可以在CHAR、VARCHAR或TEXT类型的列上创建,但需要注意的是,不同版本的MySQL支持的存储引擎可能有所不同。

  4. 空间索引(Spatial索引):

    • 用于对空间数据类型(如GEOMETRY)的字段进行索引。

    • 它主要用于地理空间数据的查询和检索。

    • 在MySQL中,空间索引可以使用R-Tree等数据结构来实现。

二、从应用层次划分

  1. 普通索引:

    • 最基本的索引类型,允许在定义索引的列中插入重复值和空值。

    • 主要目的是加快系统对数据的访问速度。

  2. 唯一索引:

    • 与普通索引类似,但索引列的值必须唯一。

    • 允许有空值,但如果是组合索引,则列值的组合必须唯一。

  3. 主键索引:

    • 是一种特殊的唯一索引,不允许值重复或为空。

    • 每个表只能有一个主键索引。

  4. 复合索引(组合索引):

    • 将表中的多个列共同组成一个索引。

    • 在查询时,只有当查询条件中包含了索引中的第一个列时,索引才会被使用。

三、其他索引类型

  1. 聚簇索引(Clustered Index):

    • 在InnoDB存储引擎中,聚簇索引是表中数据的物理存储方式。

    • 聚簇索引的叶子节点包含了表中的实际数据行,因此找到聚簇索引也就找到了数据本身。

    • 一个表只能有一个聚簇索引,且聚簇索引默认是主键索引。

  2. 非聚簇索引(Non-Clustered Index):

    • 与聚簇索引相对,非聚簇索引的叶子节点不直接包含表中的数据,而是包含了一个指向表中数据行的指针或键。

    • 在访问非聚簇索引时,通常需要回表查询来获取实际的数据。

  3. 自适应哈希索引(Adaptive Hash Index, AHI):

    • 是InnoDB存储引擎中的内存结构的组成部分。

    • InnoDB存储引擎会自动根据访问的频率和模式来自动地为某些热点页建立哈希索引,以提高查询速度。

需要注意的是,索引的类型和存储引擎有关,每种存储引擎所支持的索引类型不一定完全相同。因此,在设计数据库和索引时,需要根据具体的应用场景和存储引擎来选择合适的索引类型。

4.索引的底层数据结构

索引的底层数据结构是数据库系统中一个至关重要的概念,它直接关系到数据库的查询效率和性能。常见的索引底层数据结构包括二叉树、红黑树、Hash表、B树和B+树等。以下是对这些数据结构的详细解析:

1. 二叉树

  • 定义:每个节点最多有两个子节点的树结构,分别为左子节点和右子节点。

  • 特点:二叉树的增删查操作复杂度和树的高度成正比,其遍历查找的时间复杂度为O(n)。在极端情况下,二叉树可能会构建成为一个单向链表结构,查找时相当于全表扫描,因此不适合作为索引的底层数据结构。

2. 红黑树

  • 定义:一种近似平衡的二叉查找树,通过左旋/右旋操作保持二叉树的平衡,避免树的高度过高。

  • 特点:虽然红黑树通过各种手段来尽量达到树的平衡,但其操作复杂度和树的高度仍然成正比,且不支持范围查询的快速查找,因此也不适合作为索引的底层数据结构。

3. Hash表

  • 定义:通过散列函数将元素的键值映射为下标,并将数据存储在数组中对应下标的位置。

  • 特点:

    • 优点:在等值查询时效率很高,时间复杂度为O(1)。

    • 缺点:不支持范围快速查找,且存在哈希冲突问题。因此,Hash表虽然在某些场景下(如K/V内存数据库)表现优异,但并不适合作为大多数数据库索引的底层数据结构。

4. B树

  • 定义:一种多路平衡树,每个节点中存储着多个元素,且所有叶子节点都位于同一层。

  • 特点:B树通过多路平衡解决了树的高度问题,但它在访问数据的查找效率上仍然有所欠缺,因为对于数据访问在非叶子节点和叶子节点都有的范围,它需要进行多次遍历。

5. B+树

  • 定义:B+树是B树的变种,是数据库索引中最常用的数据结构。

  • 特点:

    • 非叶子节点不存储数据:只存储键值,这减少了非叶子节点的磁盘I/O操作。

    • 叶子节点包含所有索引字段:并且叶子节点之间使用双向指针进行连接,形成了一个双向且有序的链表结构,这极大地提高了范围查询的效率。

    • 支持等值查询和范围查询:由于B+树的这些特点,它既能保证等值查询的效率,又能支持范围查询的快速查找。

总结

在数据库索引的底层数据结构中,B+树因其良好的性能和广泛的应用场景而被广泛采用。它能够有效地减少磁盘I/O操作次数,提高查询效率,并支持等值查询和范围查询等多种查询方式。相比之下,其他数据结构如二叉树、红黑树和Hash表等在某些方面存在不足,因此不适合作为数据库索引的底层数据结构。

5.B树和B+树的区别

B树和B+树是数据库索引中常见的两种数据结构,它们之间在多个方面存在显著的区别。以下是B树和B+树的主要区别:

1. 节点存储数据的方式

  • B树:叶子结点和非叶子节点都会存储数据,指针和数据共同保存在同一节点中。这意味着在B树中,无论是内部节点还是叶子节点,都可能包含实际的数据记录。

  • B+树:数据均保存在叶子节点,非叶子节点只存储索引信息(即关键字和指向子节点的指针)。这种设计使得B+树的非叶子节点更加“轻量”,专注于索引功能。

2. 查找数据过程

  • B树:查找数据可能需要在各个节点上进行,包括内部节点和叶子节点。由于内部节点也存储数据,查找过程可能在不同层级的节点之间跳跃,导致查找效率不稳定。

  • B+树:查找数据只在叶子节点上进行。非叶子节点仅用于索引定位,引导查找过程从根节点逐层向下,直到叶子节点。这种“路径唯一”的查找方式使得B+树的查找效率更加稳定。

3. 空间利用率

  • B树:由于每个节点都存储数据,空间利用率相对较低。特别是在数据量较大的情况下,B树的节点可能很快被填满,导致树的高度增加,影响查询性能。

  • B+树:只有叶子节点存储数据,非叶子节点只存储索引信息。这种设计使得B+树能够更有效地利用空间,因为非叶子节点可以容纳更多的索引项,从而减少树的高度。

4. 结构稳定性

  • B树:插入和删除数据时需要频繁变更树的结构,包括节点的分裂和合并等操作。这些操作可能导致树的结构变得不稳定,影响查询性能。

  • B+树:插入和删除数据操作均放在叶子节点上进行,非叶子节点保持不变。这种设计维护了树结构的稳定性,使得B+树在数据变动时能够保持较好的查询性能。

5. 范围查找性能

  • B树:由于数据可能分散存储在多个节点中,范围查找需要在各个节点上逐个查找,效率较低。

  • B+树:所有数据记录都存储在叶子节点上,且叶子节点同时还维护了一条双向链表。这种设计使得B+树在进行范围查询时能够高效地遍历叶子节点链表,从而提高范围查询的效率。

6. 应用场景

  • B树:由于其结构特点,B树更适合于数据库的索引结构,特别是处理大量点查询的场景。

  • B+树:由于其良好的空间利用率和查询性能(特别是范围查询性能),B+树更适合用于文件系统等场景,以及处理大量范围查询和排序操作的数据库索引。

综上所述,B树和B+树在节点存储数据的方式、查找数据过程、空间利用率、结构稳定性和范围查找性能等方面存在显著的区别。这些区别使得它们在不同的应用场景中各有优势。

6.SQL优化

SQL优化是数据库管理和维护中的一项重要任务,旨在提高数据库查询和操作的效率,减少资源消耗。以下是一些SQL优化的关键方法和策略:

1. 索引优化

  • 建立索引:在WHERE和ORDER BY子句中涉及的列上建立索引可以显著提高查询速度。确保索引覆盖了查询中的过滤和排序条件。

  • 复合索引:对于多列查询,可以考虑建立复合索引。使用复合索引时,需遵守最左前缀原则,即查询条件中必须包含索引的最左边列。

  • 避免过多索引:虽然索引可以提高查询速度,但过多的索引会占用大量磁盘空间,并降低更新表的速度(因为每次更新表时都需要更新索引)。因此,应根据实际查询需求合理设置索引。

2. 查询优化

  • 避免SELECT *:尽量指定需要查询的字段,而不是使用SELECT *。这样可以减少数据传输量,提高查询效率。

  • 优化WHERE子句:

    • 避免在WHERE子句中对字段进行NULL值判断,因为这可能导致全表扫描。

    • 尽量避免使用OR来连接条件,因为这也可能导致索引失效。

    • 慎用IN和NOT IN操作符,因为它们可能导致全表扫描。对于连续的数值范围,可以使用BETWEEN。

    • 避免在WHERE子句中对字段进行函数或表达式操作,因为这会使索引失效。

  • 使用LIMIT:当只需要查询部分数据时,使用LIMIT子句可以减少数据传输量,提高查询效率。

3. 语句优化

  • 使用EXISTS代替IN:在某些情况下,使用EXISTS代替IN可以提高查询效率。因为EXISTS子句在找到第一个匹配项时就会停止搜索。

  • 优化JOIN操作:在JOIN操作中,尽量使用小表作为驱动表,并确保JOIN条件上有索引。

  • 避免子查询:子查询可能会导致查询效率低下,尤其是当子查询返回大量数据时。可以考虑将子查询改写为JOIN操作或使用临时表。

4. 其他优化策略

  • 使用表变量代替临时表:在可能的情况下,使用表变量代替临时表可以减少系统表资源的消耗。但请注意,表变量的索引非常有限(只有主键索引)。

  • 避免频繁创建和删除临时表:频繁创建和删除临时表会消耗大量系统资源。如果需要使用临时表,请考虑在存储过程的最后显式删除它们。

  • 优化存储过程和触发器:在存储过程和触发器的开始处设置SET NOCOUNT ON,在结束时设置SET NOCOUNT OFF,以减少网络传输量。

  • 考虑使用全文检索:对于LIKE '%value%'这样的模糊查询,如果数据量很大,可能会导致查询效率低下。此时,可以考虑使用全文检索来提高查询效率。

5. 性能分析工具

  • 使用EXPLAIN关键字:大多数数据库都提供了EXPLAIN关键字,用于分析SQL语句的执行计划。通过查看执行计划,可以了解查询是如何执行的,并找到性能瓶颈所在。

  • 定期监控和分析:定期监控数据库的性能指标(如查询响应时间、CPU使用率、内存使用率等),并对查询日志进行分析,以发现潜在的性能问题。

综上所述,SQL优化是一个综合性的工作,需要从索引、查询、语句、其他策略以及性能分析工具等多个方面入手。通过不断的优化和调整,可以显著提高数据库的性能和稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/782751.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

格蠹汇编阅读理解

一、调试工具使用方式 WinDbg常用命令: 执行 lm 命令,可以看到进程中有几个模块。执行~命令列一下线程。用!heap 命令列一下堆。执行!address 命令可以列出用户态空间中的所有区域。搜索吧!就从当前进程用户态空间的较低地址开始搜&#xf…

基于大数据技术Hadoop的气象分析可视化大屏设计和实现

博主介绍:硕士研究生,专注于信息化技术领域开发与管理,会使用java、标准c/c等开发语言,以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架…

Android - 手势

Android 提供特殊类型的触摸屏事件,例如捏合、双击、滚动、长按和退缩。 这些都被称为手势。 Android 提供了 GestureDetector 类来接收运动事件并告诉我们这些事件是否对应手势。 要使用它,您需要创建一个 GestureDetector 对象,然后使用 Ge…

SpringBoot源码阅读(1)——环境搭建

SpringBoot官网 官网 https://spring.io/projects/spring-boot 代码仓库 github:https://github.com/spring-projects/spring-boot gitee: https://gitee.com/mirrors/spring-boot 下载代码 git clone https://gitee.com/mirrors/spring-boot.git下载的代码中有些…

如何看自己电脑的ip地址?这些方法教你搞定

在数字化时代,网络已经成为我们生活中不可或缺的一部分。对于每一个接入网络的设备来说,IP地址就像是一个独特的身份证,它标识着设备在网络中的位置。对于电脑用户而言,了解如何查看自己电脑的IP地址,不仅有助于我们更…

满足信创环境运行的国产FTP服务器是什么样的?

2018 年以来,受“华为、中兴事件”影响,我国科技尤其是上游核心技术受制于人的现状对我 国经济发展提出了严峻考验。在全球产业从工业经济向数字经济升级的关键时期,中国明确 “数字中国”建设战略, 抢占数字经济产业链制高点。 在…

【Python】已解决:(paddleocr导包报错)ModuleNotFoundError: No module named ‘paddle’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:(paddleocr导包报错)ModuleNotFoundError: No module named ‘paddle’ 一、分析问题背景 近日,一些使用PaddleOCR库进行文字…

西安电子科技大学833、834学长经验分享(初复试总成绩第一、机试第二)

考研经验分享 首先自我介绍。2024考研上岸西安电子科技大学计算机学硕,初试成绩 390 分,复试成绩第一,初复试总成绩第一,机试第二,跟着研梦全程班上岸。 成绩单: 本文主要分为以下几个部分:【…

可视化作品集(09):可视化运维大屏不可或缺。

可视化大屏在可视化运维上有很多价值,而且应用十分普遍,本文给老铁们分享一下。 1. 实时监控:可视化大屏可以实时展示系统运行状态、设备状态、生产数据等信息,使运维人员能够及时发现问题并做出相应的处理。 2. 数据分析&#x…

资源分享—2021版三调符号库

汇总整理平台软件支持过程中客户项目提供的各类资源(包括但不限于符号库、地图模板等),在客户允许情况下进行集团内分享。 本次分享新版国土空间规划【三调符号库(2021版)】,提供SuperMap格式符号库下载。 …

2 ECMAScript

JavaScript 概述 JavaScript 编程语言允许你在 Web 页面上实现复杂的功能;如果你看到一个网页不仅仅显示静态的信息,而是显示依时间更新的内容,或者交互式地图,或者 2D/3D 动画图像,或者滚动的视频播放器,等等——你基本可以确定,这需要 JavaScript 的参与 JavaScript 编程语言…

GraalVM上的多语言混合开发

上篇文件我们介绍了GraalVM强大的静态编译功能,能够让Java应用程序摆脱虚拟机的束缚,像其它本地编译的应用一样直接运行。那么GraalVM的神奇之处仅限于此吗?今天我们再来看看它的另一个重要特性—多语言混合开发 多语言平台 Java并不是唯一运行在JVM上的语言,这个我们都应…

仿qq音乐播放微信小程序模板源码

手机qq音乐应用小程序,在线音乐播放器微信小程序网页模板。包含:音乐歌曲主页、推荐、排行榜、搜索、音乐播放器、歌单详情等。 仿qq音乐播放微信小程序模板源码

【前端界面分享】

实现效果:html源码来自b站up主:【CSSJS】甲方:啊?没叫你做那么超前啊_哔哩哔哩_bilibili 本人仅实现了将html格式改为vue3 html版: 对于前端连入门可能都没摸到,学了半天也就改成vue3了,对于输…

PCB阻抗控制为何如此重要?

或许你在各个厂商打PCB板的时候,会遇到询问你是否需要阻抗的的下单需求? 在当今的应用中,设计通常变得越来越快,控制布局参数比以往任何时候都更加重要。 在PCB设计和生产过程中,有几种方法可以进行阻抗控制。最常见的…

介绍一款Java开发的商业开源MES系统

介绍一款Java开发的开源MES系统,万界星空科技开源的MES系统。该系统基于Java开发,具有广泛的适用性和高度的可定制性,能够满足不同行业、不同规模企业的智能制造需求。 一、系统概述 万界星空科技开源的MES系统是一款面向制造企业车间执行层…

限流实现-小工具

需求描述 写一个1秒两个的限流工具类,2r/s public class LimitHelper {private int maxLimit;private Semaphore semaphore;private int timeoutSeconds;public LimitHelper(int maxLimit, int timeoutSeconds) {this.maxLimit maxLimit;semaphore new Semaphore…

产品经理-的职业发展(9)

找一份好工作,就是为了获得更好的职业发展,下面分别给大家介绍下大、中、小型公司的职业发展路径 中小型公司 中小型公司的规模往往相对不大,又处于飞速发展过程中,培养体系和晋升标准都不够成熟,所以实际的职业发展路…

如何大幅减少 Vue.js 中的包大小和加载时间,提升用户体验!

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 你知道吗,根据Google 的一项研究,如果网站加载时间超过 3 秒,53% 的移动用户会离开该网站? 性能优化是一个经常讨论的话题,但很多开发人员并不关心提高应用的速度。 在前端开发中,优化包大小和加载时间对于提升用户体…

电力设备巡检管理系统

电力设备巡检管理系统是一种基于计算机技术和网络通信技术的智能化管理系统,旨在提高电力设备巡检的效率、准确性和安全性。以下是对该系统的详细介绍: 一、系统概述 电力设备巡检管理系统通过实时采集、传输和分析电力设备的数据,帮助电力企…