当前位置:首页 > 文章列表 > 数据库 > MySQL > MySQL索引的作用是什么

MySQL索引的作用是什么

来源:亿速云 2023-04-27 07:34:26 0浏览 收藏

数据库小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《MySQL索引的作用是什么》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


    首先建立一张数据库表:

    create table single_table(
    	id int not auto_increment, 
    	key1 varchar(100),         
    	key2 int,
    	key3 varchar(100),
    	key_part1 varchar(100),
    	key_part2 varchar(100),
    	key_part3 varchar(100),
        common_field varchar(100),
    	primary key(id),          # 聚簇索引
    	key idx_key1(key1),       # 二级索引
    	unique key uk_key2(key2), # 二级索引,而且该索引是唯一二级索引
    	key idx_key3(key3),       # 二级索引
    	key idx_key_part(key_part1,key_part2,key_part3) # 二级索引,也是联合索引
    )Engine=InnoDB CHARSET=utf8;

    1、索引用于减少需要扫描的记录数量

    对于某个查询来说,最简单粗暴的执行方案就是扫描表中的所有记录,判断每一条搜索记录是否符合搜索条件。如果符合,就将其发送到客户端,否则就跳过该记录。这种执行方案被称为全表扫描。

    对于InnoDB存储引擎来说,全表扫描意味着从聚簇索引第一个叶子节点的第一条记录开始,沿着记录所在的单向链表向后扫描,直到最后一个叶子节点的最后一条记录,如果可以利用B+树查找索引列值等于某个值的记录,这样就可以减少需要扫描的记录的数量。

    由于B+树叶子节点中的记录是按照索引列值有小到大的顺序排序的,所以只需要扫描某个区间或者某些区间中的记录也可以明显减少需要扫描的记录的数量。

    对于查询语句:

    select * from single_table where id>=2 and id

    这个语句其实就是想查找id值在[2,100]区间中的所有聚簇索引记录,我们可以通过聚簇索引对应的B+树快速的找到id=2的那条聚簇索引记录,然后沿着记录所在的单向链表向后扫描,直到某条聚簇索引记录的id值不在[2,100]区间中为止,与扫描全部的聚簇索引记录相比,这种方式大大减少了需要扫描的记录数量,所以提升了查询效率。

    其实,对于B+树来说,只要索引列和常数使用=、、in、not in、is null、is not null、>、=、操作符连接起来,就可以产生扫描区间,从而提高查询效率。

    2、索引用于排序

    我们在编写查询语句时,经常需要使用order by子句对查询出来的记录按照某种规则进行排序。在一般情况下,我们只能把记录加载到内存中,然后再用一些排序算法在内存中对这些记录进行排序。有时查询的结果集可能太大以至于在内存中无法进行排序,此时就需要暂时借助磁盘的空间来存放中间结果,在排序操作完成后再把排序的结果返回给客户端。

    在MySQL中,这种在内存中或者磁盘中进行排序的方式称为文件排序,但是如果order by子句中使用了索引列,就有可能省去在内存或磁盘中排序的步骤。

    1、分析下面的查询语句:

    select * form single_table order by key_part1,key_part2,key_part3 limit 10;

    这个查询语句的结果集需要先按照key_part1值排序,如果记录的key_part1值相同,再按照key_part2值排序,如果key_part1值和key_part2值都相同,再按照key_part3排序。而我们建立的联合索引idx_key_part就是按照上面的规则排序的,如下为idx_key_part索引的简化示意图:

    MySQL索引的作用是什么

    所以我们可以从第一条idx_key_part二级索引记录开始,沿着记录所在的单向链表向后扫描,取10条二级索引记录即可。由于我们的查询列表是*,也就是需要读取完整的用户记录,所以针对获取到的每一条二级索引记录都执行一次回表操作,将完整的用户记录发送给客户端。这样就省去了给10000条记录排序的时间。

    这里我们在执行查询语句时加了limit语句,如果不限制需要获取的记录数量,会导致为大量二级索引记录执行回表操作,这样会影响整体的性能。

    2、使用联合索引进行排序时的注意事项

    在使用联合索引时,需要注意:order by子句后面的列的顺序也必须按照索引列的顺序给出;如果给出order by key_part3,key_part2,key_part1的顺序,则无法使用B+树索引。

    之所以颠倒排序列顺序就不能使用索引,原因还是联合索引中页面和记录的排序规则是规定的,即先按照key_part1值排序,如果记录的key_part1值相同,再按照key_part2值排序,如果记录的key_part1值和key_part2值都相同,再按照key_part3值排序。如果order by子句的内容是order by key_part3,key_part2,key_part1,那就要求先按照key_part3值排序,如果记录的key_part3值相同,再按照key_part2值排序,如果记录的key_part3值和key_part2值都相同,再按照key_part1值排序,这显然是冲突的。

    3、不可以使用索引进行排序的情况:

    (1) ASC、DESC混用;

    对于使用联合索引进行排序的场景,我们要求各个排序列的排序规则是一致的,也就是要么各个列都是按照升序规则排序,要么都是按照降序规则排序。

    (2) 排序列包含非一个索引的列;

    有时用来排序的多个列不是同一个索引中的,这种情况也不能使用索引进行排序,比如下面的查询语句:

    select * from single_table order by key1,,key2 limit 10;

    对于idx_key1的二级索引记录来说,只按照key1列的值进行排序,而且在key1列相同的情况下是不按照

    key2列的值进行排序的,所以不能使用idx_key1索引执行上述查询。

    (3) 排序列是某个联合索引的索引列,但是这些排序列在联合索引中并不连续;

    (4) 排序列不是以单独列名的形式出现在order by子句中;

    3、索引用于分组

    有时为了方便统计表中的一些信息,会把表中的记录按照某些列进行分组。比如下面的分组查询语句:

    select key_part1,key_part2,key_part3,count(*) fron single_table group by key_part1,key_part2,key_part3;

    这个查询语句相当于执行了3次分组操作:

    • 先按照key_part1值把记录进行分组,key_part1值相同的所有记录划分为一组;

    • key_part1值相同的每个分组中的记录再按照key_part2的值进行分组,将key_part2值相同的记录放到一个小分组中,看起来像是在一个大分组中又细分了好多小分组。

    • 再将上一步中产生的小分组按照key_part3的值分成更小的分组。所以整体上看起来就像是先把记录分成一个大分组,然后再把大分组分成若干个小分组,最后把若干个小分组再细分为更多的小分组。

    上面这个查询语句就是统计每个小小分组包含的记录条数。

    如果没有idx_key_part索引,就得建立一个用于统计的临时表,在扫描聚簇索引的记录时将统计的中间结果填入这个临时表。当扫描完记录后,再把临时表中的结果作为结果集发送给客户端。

    如果有了idx_key_part索引,恰巧这个分组顺序又与idx_key_part的索引列的顺序一致,因此可以直接使用idx_key_part的二级索引进行分组,而不用建立临时表了。

    与使用B+树索引进行排序差不多,分组列的顺序页需要与索引列的顺序一致,也可以值使用索引列中左边连续的列进行分组。

    今天带大家了解了的相关知识,希望对你有所帮助;关于数据库的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

    版本声明
    本文转载于:亿速云 如有侵犯,请联系study_golang@163.com删除
    如何修复Origin在线登录当前不可用的问题如何修复Origin在线登录当前不可用的问题
    上一篇
    如何修复Origin在线登录当前不可用的问题
    如何在 Windows 11 中下载华硕 Realtek 高清音频管理器
    下一篇
    如何在 Windows 11 中下载华硕 Realtek 高清音频管理器
    查看更多
    最新文章
    查看更多
    课程推荐
    • 前端进阶之JavaScript设计模式
      前端进阶之JavaScript设计模式
      设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
      543次学习
    • GO语言核心编程课程
      GO语言核心编程课程
      本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
      516次学习
    • 简单聊聊mysql8与网络通信
      简单聊聊mysql8与网络通信
      如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
      500次学习
    • JavaScript正则表达式基础与实战
      JavaScript正则表达式基础与实战
      在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
      487次学习
    • 从零制作响应式网站—Grid布局
      从零制作响应式网站—Grid布局
      本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
      485次学习
    查看更多
    AI推荐
    • ljg-skills -
      ljg-skills
      ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
      56次使用
    • MELO音乐 - AI 音乐生成平台,支持多模态创作能力
      MELO音乐
      MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
      67次使用
    • UniScribe - AI 免费在线音视频转文字平台
      UniScribe
      UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
      70次使用
    • 剧云 - 免费 AI 智能中文剧本创作平台
      剧云
      剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
      212次使用
    • 万象有声 - AI 一站式有声内容创作平台
      万象有声
      万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
      212次使用
    微信登录更方便
    • 密码登录
    • 注册账号
    登录即同意 用户协议隐私政策
    返回登录
    • 重置密码