MySQL数据库(五)索引

 一 索引概述

1 介绍:MySQL索引是一种有序数据结构,它能够高效帮助数据库系统快速定位到表中的特定记录,从而显著提高查询效率。索引可以被看作是书的目录,通过它可以迅速找到所需的信息而不需要逐页翻阅整本书。

2 优缺点

二 索引结构

MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要包含以下几种:

兼容性

数据结构可视化网站

Data Structure Visualization (usfca.edu)

三 索引分类

在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种

回表查询

回表查询:先根据二级索引查找到目标行,但是没有所需要的字段,那么首先定位到主键再对数据库进行查询从而得到需要的字段信息

四 索引语法

五 SQL性能分析

执行频率

代码实现

# 查询的是整个数据库的各种功能的查询次数
show global status like 'Com_______';

慢查询日志

profile详情

explain执行计划

六 索引使用

1 最左前缀法则

如果索引了多列(联合索引),要遵守最左前缀法则。

最左前缀法则指的 是 查询过程 从索引的最左列开始,并且不跳过索引中的列。

如果跳跃某一列,索引将部分失效(后面的字段索引失效)。

同时:

2 范围查询

联合查询中,出现范围查询(>,<)范围查询右侧的列索引失效

在业务允许的条件下尽量使用>=,<=

3 索引列运算

不要在索引列上进行运算操作,否则索引将失效。

   

4 字符串不加引号

字符串类型字段使用时,不加引号,索引将失效。

5 模糊查询

如果是 对尾部进行模糊匹配,索引不会失效,如果是 对头部进行模糊匹配,索引失效。

6 or连接的条件

用 or 分隔开的条件,如果 or 不是两侧都有索引, 那么涉及的索引都不会被用到。

只有两侧都有索引的时候,索引才会生效。

7 数据分布影响

如果MySQL评估使用索引比全表更慢,则不使用索引。

8 SQL提示

SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的。

联合索引和单列索引(不指定)

建议

忽略

强制

9 覆盖索引

覆盖索引(Covering Index),也称为索引覆盖,是数据库查询优化中一个非常重要的概念。它指的是当一个索引包含了查询所需的所有字段时,MySQL可以直接从这个索引中获取所有需要的数据,而不需要再去访问数据表中的实际行记录,从而避免了回表操作(即通过主键索引再次查找数据的过程)

覆盖索引的工作原理

在InnoDB存储引擎中,每个表都有一个聚簇索引(Clustered Index),通常是主键索引。除了聚簇索引之外的所有其他索引都被称为非聚簇索引或二级索引(Secondary Index)。在二级索引的叶子节点中,除了存储索引列的值外,还会存储对应行的主键值。当执行查询时,如果所需的全部数据都在二级索引中,则无需再通过主键去查找完整的行记录,这就是所谓的覆盖索引。

EG

profession,age,status属于联合索引(二级索引) id 属于主键索引(聚簇索引)

所以查找到一个就可以直接查询检索到其他的,而name属于另一个二级索引,需要回表查询(先

根据前面的联合查询结果得到对应的id值再利用id值查询对应的行如何查找name)。

10 前缀索引

当字段类型为字符串,有时候需要索引很长的字符串,这回让索引变的很大,查询时,浪费大量的磁盘IO,影响查询效率。此时可以只将字符串的一部分前缀建立索引,这样可以大大节约索引空间,从而提高索引检索效率。

前缀索引的基本思想是通过对字段值的前n个字符建立索引,以此来减少索引数据量。

前缀索引特别适用于那些列值较长且前几个字符就足以区分大多数记录的情况。例如,对于姓名、电子邮件地址或URL等字段,前缀索引可能会非常有用。但是,对于像身份证号码这样的字段,由于前几位数字往往相同,使用前缀索引可能不是最佳选择

 代码实现

潜在问题

但是如果查找的结果为多个引擎会重新匹配

11 索引使用

单列索引与联合索引

单列索引:一个索引只包含单个列

联合索引:一个索引包含多个列

单列索引

这种情况下就会出现回表查询,先根据索引查询到phone 再回表根据id查找到id值对应的这一行再检查name是否正确(这种情况下使用联合查询更好)

联合查询

联合索引则是在多个列上创建的索引,它能够覆盖多列上的查询需求。联合索引的优势在于它可以同时加速涉及这些列的查询,并且遵循所谓的“最左前缀原则”。

七 索引设计原则

  • 1 针对数据量较大且查询频繁的表建立索引,对于这样的表合理地创建索引可以显著提高查询性能。确保索引能够覆盖最常见的查询模式,这有助于快速定位所需的数据行,减少不必要的全表扫描。
  • 2 针对常作为查询条件(WHERE)、排序(ORDER BY)、分组(GROUP BY)操作的字段建立索引,通常在WHERE子句中使用的字段是理想的索引候选者。这些字段上的索引可以显著减少查询时扫描的数据行数。经常用于ORDER BYGROUP BY的字段也应该建立索引,以加速排序和分组操作,这样可以避免数据库执行额外的排序步骤,提升查询效率。
  • 3 尽量选择区分度高的列作为索引,尽量建立唯一索引。选择那些具有高基数即不同值的比例较高的列来创建索引,这样可以使得查询更加高效。例如使用身份证号码作为索引比使用性别作为索引要好得多。尽量建立唯一索引不仅能保证数据的唯一性,还能提高查询效率,因为它可以直接定位到特定的记录而不需要进一步检查。
  • 4 如果是字符串类型的字段,字段的长度较长,可以针对字段的特点,建立前缀索引。对于长字符串类型的字段,考虑只对前缀建立索引来减少索引大小并提高查询效率。例如如果经常查询姓名的前几个字符,可以创建一个前缀索引,这样可以在不影响查询准确性的同时减小索引的存储空间。
  • 5 尽量使用联合索引,减少单列索引。查询时联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。通过合理安排列的顺序通常将区分度最高的列放在前面,可以使联合索引更加有效地服务于多种查询需求,从而提高查询速度和效率。
  • 6 控制索引的数量,索引并不是多多益善,索引越多维护索引结构的代价也就越大,会影响增删改的效率。定期评估索引的有效性,移除那些不再需要或者极少使用的索引,以减轻维护负担并节省存储空间。保持适量的索引是数据库优化的关键之一。
  • 7 处理NULL值,如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询,这对于优化查询计划至关重要。
  • 8 避免索引列参与计算或函数调用,在查询语句中如果索引列被函数或者表达式包裹,则MySQL优化器可能无法使用该索引,导致全表扫描。因此应该尽可能保持索引列“干净”,直接基于原始值进行比较而不是经过任何转换或计算。
  • 9 注意LIKE模糊查询,在进行LIKE查询时如果模式是以通配符开头如'%abc',则索引不会被使用。为了利用索引,应该尽量避免这样的查询方式,优先考虑从左侧开始匹配的模式,比如'abc%',这样可以充分利用索引的优势。
  • 10 定期评估和调整索引策略,随着业务的发展和数据的变化,索引策略也需要相应地进行调整和优化。定期评估索引的有效性,并根据实际查询需求进行调整,确保索引设计始终符合当前的查询模式和数据分布情况。这样可以持续保持数据库的最佳性能状态。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

让文物“活”起来,以3D数字化技术传承文物历史文化!

文物&#xff0c;作为不可再生的宝贵资源&#xff0c;其任何毁损都是无法逆转的损失。然而&#xff0c;当前文物保护与修复领域仍大量依赖传统技术&#xff0c;同时&#xff0c;文物管理机构和专业团队的力量相对薄弱&#xff0c;亟需引入数字化管理手段以应对挑战。 积木易搭…

一文解释nn、nn.Module与nn.functional的用法与区别

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;零基础入门PyTorch框架_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 …

HAL库外设宝典:基于CubeMX的STM32开发手册(持续更新)

目录 前言 GPIO&#xff08;通用输入输出引脚&#xff09; 推挽输出模式 浮空输入和上拉输入模式 GPIO其他模式以及内部电路原理 输出驱动器 输入驱动器 中断 外部中断&#xff08;EXTI&#xff09; 深入中断&#xff08;内部机制及原理&#xff09; 外部中断/事件控…

ChatGPT怎么回事?

纯属发现&#xff0c;调侃一下~ 这段时间deepseek不是特别火吗&#xff0c;尤其是它的推理功能&#xff0c;突发奇想&#xff0c;想用deepseek回答一些问题&#xff0c;回答一个问题之后就回复服务器繁忙&#xff08;估计还在被攻击吧~_~&#xff09; 然后就转向了GPT&#xf…

结合深度学习、自然语言处理(NLP)与多准则决策的三阶段技术框架,旨在实现从消费者情感分析到个性化决策

针对电商个性化推荐场景的集成机器学习和稳健优化三阶段方案。 第一阶段:在线评论数据处理&#xff0c;利用深度学习和自然语言处理技术进行特征挖掘&#xff0c;进而进行消费者情感分析&#xff0c;得到消费者偏好 在第一阶段&#xff0c;我们主要关注如何通过深度学习和自然语…

Websocket从原理到实战

引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议&#xff0c;它使得客户端和服务器之间能够进行实时、双向的通信&#xff0c;既然是通信协议一定要从发展历史到协议内容到应用场景最后到实战全方位了解 发展历史 WebSocket 最初是为了解决 HTTP 协议在实时…

[LeetCode]day16 242.有效的字母异位词

242. 有效的字母异位词 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的 字母异位词 示例 1: 输入: s "anagram", t "nagaram" 输出: true示例 2: 输入: s "rat"…

UnityShader学习笔记——动态效果

——内容源自唐老狮的shader课程 目录 1.原理 2.Shader中内置的时间变量 3.Shader中经常会改变的数据 4.纹理动画 4.1.背景滚动 4.1.1.补充知识 4.1.2.基本原理 4.2.帧动画 4.2.1.基本原理 5.流动的2D河流 5.1.基本原理 5.2.关键步骤 5.3.补充知识 6.广告牌效果 …

【Redis keys命令有什么问题?】

Redis keys命令有什么问题? 性能问题实际使用中的限制替代方案示例讲解Redis keys命令的问题示例替代方案:使用SCAN命令Java代码示例性能问题 时间复杂度:keys命令的时间复杂度是O(n),其中n是Redis中键的总数。这意味着,当Redis中存储的键数量非常大时,执行keys命令会遍历…

Python用langchain、OpenAI大语言模型LLM情感分析苹果股票新闻数据及提示工程优化应用...

全文链接&#xff1a;https://tecdat.cn/?p39614 本文主要探讨了如何利用大语言模型&#xff08;LLMs&#xff09;进行股票分析。通过使用提供的股票市场和金融新闻获取数据&#xff0c;结合Python中的相关库&#xff0c;如Pandas、langchain等&#xff0c;实现对股票新闻的情…

第19章 Future设计模式(Java高并发编程详解:多线程与系统设计)

1.先给你一张凭据 假设有个任务需要执行比较长的的时间&#xff0c;通常需要等待任务执行结束或者出错才能返回结果&#xff0c; 在此期间调用者只能陷入阻塞苦苦等待&#xff0c; 对此&#xff0c; Future设计模式提供了一种凭据式的解决方案。在我们日常生活中&#xff0c;关…

[Android] 全球网测-版本号4.3.8

[Android] 全球网测 链接&#xff1a;https://pan.xunlei.com/s/VOIV5G3_UOFWnGuMQ_GlIW2OA1?pwdfrpe# 应用介绍 "全球网测"是由中国信通院产业与规划研究所自主研发的一款拥有宽带测速、上网体验和网络诊断等功能的综合测速软件。APP突出六大亮点优势&#xff1a…

判断您的Mac当前使用的是Zsh还是Bash:echo $SHELL、echo $0

要判断您的Mac当前使用的是Zsh还是Bash&#xff0c;可以使用以下方法&#xff1a; 查看默认Shell: 打开“终端”应用程序&#xff0c;然后输入以下命令&#xff1a; echo $SHELL这将显示当前默认使用的Shell。例如&#xff0c;如果输出是/bin/zsh&#xff0c;则说明您使用的是Z…

MYSQL第四次

目录 题目分析 代码实现 一、修改 Student 表中年龄&#xff08;sage&#xff09;字段属性&#xff0c;数据类型由 int 改变为 smallint 二、为 Course 表中 Cno 字段设置索引&#xff0c;并查看索引 三、为 SC 表建立按学号&#xff08;sno&#xff09;和课程号&#xff…

MATLAB | 基于Theil-Sen斜率和Mann-Kendall检验的栅格数据趋势分析

最近看到一些博主分享关于 SenMK 检验的代码&#xff0c;对于新手来说可能有点复杂。我们编写了一段 MATLAB 代码&#xff0c;能够一次性解决这些问题&#xff0c;简化操作流程。我们还准备了几个关于趋势检验的空间分布图&#xff0c;供大家参考。 一、Sens Slope和Mann-Kenda…

72.在 Vue3 中使用 OpenLayers 进行 Drag-and-Drop 拖拽文件解析并显示图形

在 WebGIS 相关的开发中&#xff0c;我们经常需要加载各种地理数据文件&#xff0c;如 GeoJSON、KML、GPX 等。而 OpenLayers 提供了 DragAndDrop 交互组件&#xff0c;使得我们可以通过拖拽方式加载这些文件&#xff0c;并将其中的地理要素渲染到地图上。 本文将详细介绍如何…

VM虚拟机安装群晖系统

下载群晖系统 https://download.csdn.net/download/hmxm6/90351935 安装群晖连接软件 synology-assistant-6.2-24922(在上面的压缩包里面) 准备好VM虚拟机 创建群晖虚拟机 打开下载下来的虚拟机 添加硬盘 选择类型 创建新的磁盘 指定容量 指定存储文件 完成硬盘添加…

瞬态分析中的时域分析与频域分析:原理、对比与应用指南

目录 一、核心概念区分 二、时域分析&#xff1a;时间维度直接求解 1. 基本原理 2. 关键特点 3. 典型算法 4. 应用案例 三、频域分析&#xff1a;频率维度的等效映射 1. 基本原理 2. 关键特点 3. 典型方法 4. 应用案例 四、对比与选择依据 1. 方法论对比 2. 工程…

基于LMStudio本地部署DeepSeek R1

DeepSeek R1 DeepSeek R1是由DeepSeek团队开发的一款高性能AI推理模型&#xff0c;其开源版本包括完整的DeepSeek R1 671B权重&#xff0c;以及基于其蒸馏出的多个小型模型。 DeepSeek R1通过蒸馏技术将推理模式迁移到更小的模型中&#xff0c;显著提升了这些模型的推理能力。…

2.攻防世界 ics-06

题目描述处给出提示 进入题目页面如下 发现只有报表中心能进入下一个页面 页面内容&#xff1a; 发现有传参 改变日期也没有变化 更改id数值页面也没有回显 猜测应该有一个特定id对应的页面即为那一处入侵者留下的数据 下面使用burp suite爆破id值 先用burp suite抓包 右键…