【MySQL】MySQL索引的定义、分类、Explain、索引失效和优化

news2024/9/24 7:16:01

索引的介绍

索引是帮助MySQL高效获取数据的数据结构
MySQL在存储数据之外,数据库系统中还维护着满足特定查找算法的数据结构,这些数据结构以某种引用(指向)表中的数据,这样我们就可以通过数据结构上实现的高级查找算法来快速找到我们想要的数据。
MySQL中常用的的索引数据结构有BTree索引(Myisam普通索引),B+Tree索引(Innodb普通索引),Hash索引(memory存储引擎)等等
索引的优势为:

  • 提高数据检索的效率,降低数据库的IO成本
  • 通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗
    索引的劣势为:
  • 索引实际上也是一张表,表的内容是主键和索引的字段,并指向实体表的记录,所以索引是需要占用空间的
  • 降低表的更新速度:当对表的数据进行增删改查的时候,MySQL要更新数据,还要保存一下索引文件。
    哪些情况需要创建索引:
  • 主键自动建立唯一索引
  • 频繁作为查询条件的字段应该创建索引(where 后面的语句)
  • 查询中与其它表关联的字段,外键关系建立索引
  • 多字段查询下倾向创建组合索引
  • 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
  • 查询中统计或者分组字段

索引的分类

1.主键索引

表中的列设定为主键后,数据库会自动建立主键索引
创建主键索引语法: alter table 表名 add primary key (字段);
删除主键索引语法: alter table 表名 drop primary key;

2.唯一索引

表中的列创建了唯一约束时,数据库会自动建立唯一索引
创建唯一索引语法:alter table 表名 add unique 索引名(字段);
create unique index 索引名 on 表名(字段);
删除唯一索引语法:drop index 索引名 on 表名;

3.单值索引

一个索引只包含单个列,一个表可以有多个单值索引
创建单值索引: alter table 表名 add index 索引名(字段);
create index 索引名 on 表名(字段);
删除单值索引:drop index 索引名 on 表名;

4.复合索引

一个索引包含多个列
创建复合索引:create index 索引名 on 表名(字段1,字段2);
alter table 表名 add index 索引名(字段,字段2);
删除复合索引: drop index 索引名 on 表名;

性能分析

常见的瓶颈

SQL中对大量数据进行比较、关联、排序、分组时CPU的瓶颈。
实例内存满足不了缓存数据或排序等需要,导致产生大量的物理IO。查询数据时扫描过多数据行,导致查询效率低。

Explain

使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理SQL语句的。
作用为:
1)表的读取顺序
2)哪些索引可以使用
3)数据读取操作的操作类型
4)那些索引被实际使用
5)表之间的引用
6)每张表有多少行被优化器查询
EXPLAIN关键字使用起来比较简单: explain + SQL语句
在这里插入图片描述

Explain的字段分析

1.id

select查询的序列号,表示查询中执行select子句或操作表的顺序。

  • id相同时,执行顺序由上至下
  • id不同,如果是子查询,id的序号会递增,id值越大优先级越高,则先被执行。
  • id相同和不同都存在时,id相同的可以理解为一组,从上往下顺序执行,所有组中,id值越大,优先级越高越先执行。

2.select_type

查询的类型,常见值有:

  • SIMPLE :简单的 select 查询,查询中不包含子查询或者UNION。
  • PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为Primary。
  • DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询, 把结果放在临时表里。
  • SUBQUERY: 在SELECT或WHERE列表中包含了子查询。

3.table

显示这一行的数据是关于哪张表的

4. type

访问类型排序
在这里插入图片描述

  • System:表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计。
  • Const:表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快,如将主键置于where列表中,MySQL就能将该查询转换为一个常量。
  • eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。
  • Ref:非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体。
  • Range:只检索给定范围的行,使用一个索引来选择行。key 列显示使用了哪个索引
    一般就是在你的where语句中出现了between、<、>、in等的查询这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。
  • Index:Full Index Scan,index与ALL区别为index类型只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小。也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘中读的。
  • All:Full Table Scan,将遍历全表以找到匹配的行。

从最好到最差依次是:system>const>eq_ref>ref>range>index>All 。一般来说,最好保证查询能达到range级别,最好能达到ref

5.possible_keys

显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上如果存在索引,则改索引将会被列出来,但不一定会被查询实际使用上。

6.key

查询中实际使用的索引,如果为NULL,则没有使用索引。

7.ref

显示索引的哪一列被使用了。哪些列或常量被用于查找索引列上的值。

8.rows

rows列显示MySQL认为它执行查询时必须检查的行数。一般越少越好。

9.extra

一些常见的重要的额外信息:

  • Using filesort:MySQL无法利用索引完成的排序操作称为“文件排序”。
  • Using temporary:Mysql在对查询结果排序时使用临时表,常见于排序order by和分组查询group by。
  • Using index:表示索引被用来执行索引键值的查找,避免访问了表的数据行,效率不错。
  • Using where:表示使用了where过滤。

索引失效

1)最佳左前缀法则:如果索引了多列,要遵循最左前缀法则,指的是查询从索引的最左前列开始并且不跳过索引中的列
2)不在索引列上做任何计算、函数操作,会导致索引失效而转向全表扫描。
3)存储引擎不能使用索引中范围条件右边的列
4)Mysql在使用不等于时无法使用索引会导致全表扫描。
5)is null可以使用索引,但是is not null无法使用索引。
6)like以通配符开头会使索引失效导致全表扫描。
7)字符串不加单引号索引会失效。
8)使用or连接时索引失效。

在这里插入图片描述

建议:

  1. 对于单值索引,尽量选择针对当前查询字段过滤性更好的索引。
  2. 对于组合索引,当前where查询中过滤性更好的字段在索引字段顺序中位置越靠前越好
  3. 对于组合索引,尽量选择能够包含在当前查询中where子句中更多字段的索引。
  4. 尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的。

学习视频

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

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

相关文章

设计原则SOLID看这一篇就够了

文章目录 1.引言1.1. 背景1.2. 简要介绍 SOLID 原则1.1. 面向对象编程和设计的重要性 2. 单一职责原则&#xff08;SRP&#xff09;2.1. 定义和原理2.2. SRP 的好处与目标2.3. 例子和代码展示2.4. 如何识别和解决 SRP 原则的违反2.5. 注意事项和局限性 3. 开闭原则&#xff08;…

Centos7.9 一键脚本部署 LibreNMS 网络监控系统

前言&#xff1a; LibreNMS 是个以 PHP/MySQL 为基底的自动探索网络监控系统 LibreNMS 官网 版本23.8.2-52-g7bbe0a2 - Thu Sep 14 2023 22:33:23 GMT0700数据库纲要2023_09_01_084057_application_new_defaults (259)Web 服务器nginx/1.20.1PHP8.1.23Python3.6.8DatabaseMa…

Killer!永久禁用WindowsDefender

工具介绍 WinDefenderKiller&#xff0c;使用C写的通过注册表项永久禁用Windows Defende的一个工具。 关注【Hack分享吧】公众号&#xff0c;回复关键字【230726】获取下载链接 编译使用 执行以下命令编译&#xff1a; # x86_64-w64-mingw32-g -O2 disableWinDef.cpp -o win…

JS 原型和原型链

原型和原型链 1. 了解原型和原型链1.1 原型1.2 原型链 2. 原型2.1 prototype2.2 __proto__ 隐式原型 3. 原型链 1. 了解原型和原型链 1.1 原型 原型&#xff1a; prototype 又称显示原型 1、原型是一个普通对象 2、只有构造函数才具备该属性 3、公有属性可操作 1.2 原型链 原…

数据治理-元数据管理-元数据类型

定义 元数据&#xff0c;定义和描述其它数据的数据。 类型 业务元数据、技术元数据和操作元数据。在图书馆或信息科学中&#xff0c;可分为描述元数据、结构元数据、管理元数据。 业务元数据 主要关注数据的内容和条件&#xff0c;另包括与数据治理相关的详细信息。业务元数据…

logback异步appender日志源码详解

背景&#xff1a; 日常打印日志时&#xff0c;使用logback的异步写日志几乎是标准的配置方式&#xff0c;本文从源码上看看异步写日志的整个流程 异步Appender日志 一般日志的配置如下所示 appender(“ASYNC-LOG”, AsyncAppender) { neverBlock true queueSize 10000 } 这…

前端需要知道的计算机网络知识----网络安全,自学网络安全,学习路线图必不可少,【282G】初级网络安全学习资源分享!

网络安全&#xff08;英语&#xff1a;network security&#xff09;包含网络设备安全、网络信息安全、网络软件安全。 黑客通过基于网络的入侵来达到窃取敏感信息的目的&#xff0c;也有人以基于网络的攻击见长&#xff0c;被人收买通过网络来攻击商业竞争对手企业&#xff0c…

CH07_封装

封装记录&#xff08;Encapsulate Record | 162&#xff09; 曾用名&#xff1a;以数据类代替记录&#xff08;Replace Record with Data Class&#xff09; organization {name: "Acme Gooseberries", country: "GB"};class Organization {constructor(…

HTML整站规划与规范

文章目录 命名规则命名命名书写 包含样式规范样式重置样式引入页面结构页面宽度页面高度与背景页面设计 网址图标 命名规则 命名 根据每块元素的主题、功能、页面上的位置命名&#xff0c;便于后期更改与维护。 另外&#xff1a;如果所有样式放在同一文件下&#xff0c;可以给…

计算如何剥出艺术品

背景&#xff1a; 今天给大家介绍一篇中国科学技术大学发表的论文《Computational Peeling Art Design》。论文要解决是&#xff1a;如何把球状三维物体的表面连续展开成一些艺术画面&#xff0c;要求是展开表面要占三维物体表面整个面积&#xff0c;展开表面要和艺术体形状尽可…

[CISCN 2022 初赛]online_crt

文章目录 涉及知识点代码审计解题过程 涉及知识点 CVE-2022-1292漏洞OpenSSLssrf 代码审计 app.py源码 import datetime import json import os import socket import uuid from cryptography import x509 from cryptography.hazmat.backends import default_backend from …

LeetCode(力扣)55. 跳跃游戏Python

LeetCode20. 有效的括号 题目链接代码 题目链接 https://leetcode.cn/problems/jump-game/ 代码 class Solution:def canJump(self, nums: List[int]) -> bool:if len(nums) < 1:return Truecover 0for i in range(len(nums)):if i < cover:cover max(cover, i …

【NVIDIA CUDA】2023 CUDA夏令营编程模型(四)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

性能测试结果评估与展示

面向性能测试部门 对测试资产进行集中管理以及从项目或系统维度进行汇总展示是两种行之有效的管理手段。这些测试资产包括脚本、缺陷描述、测试记录、测试报告、项目需求等资料,通过对这些资料进行分类,当原有人员缺失的情况下,新接手的测试工程师能快速了解关键信息。 使…

Android RecyclerView BaseSectionQuickAdapter实现分组功能

详情网站&#xff1a;手把手教你使用BaseSectionQuickAdapter实现分组功能&#xff0c;史上最详细Adapter使用教程_basequickadapter 分组_杨阿程的博客-CSDN博客 //加入二个包implementation com.android.support:recyclerview-v7:26.0.0-beta1implementation com.github.Cym…

SAP 选择屏幕动态通过Radio Button 显示与隐藏以及控制是否必输

如何在选择屏幕上进行动态展示屏幕字段&#xff0c;并且进行必输项检查控制 1. 选择屏幕定义 SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.SELECTION-SCREEN BEGIN OF LINE.PARAMETERS: p_r1 TYPE c RADIOBUTTON GROUP grp USER-COMMAND uc DEFAULT X. &q…

【推荐】赴日IT课程 做赴日IT我该学什么?

许多想要做赴日IT的朋友问我说&#xff0c;我都该准备什么&#xff0c;或者我该学些什么才能达到可以做赴日程序员的水平呢&#xff1f;今天我就来跟大家聊一下这个问题。要说做准备&#xff0c;你需要有全日制大专及以上的学历才能获得赴日的资格&#xff0c;如果没有我们就先…

【Linux】线程的概念

文章目录 &#x1f4d6; 前言1. 线程的引入1.1 执行流&#xff1a;1.2 线程的创建&#xff1a;1.3 线程的等待&#xff1a; 2. 查看线程2.1 链接线程库&#xff1a;2.2 ps -aL&#xff1a; 3. 页表的认识3.1 二级页表&#xff1a;3.2 页表的实际大小&#xff1a; 4. 再看线程4.…

全面深入理解TCP协议(超详细)

目录 前言 TCP协议格式 确认应答机制(ACK) 理解可靠性 确认应答的机制 16位窗口大小 缓冲区 流量控制 6个标志位 16位紧急指针 ★三次握手&#xff0c;四次挥手 如何理解连接 如何理解三次握手 如何理解四次挥手 TCP可靠性机制 确认应答机制(补充) ​编辑…

70、Spring Data JPA 的 自定义查询(全手动,自己写完整 SQL 语句)

1、方法名关键字查询&#xff08;全自动&#xff0c;既不需要提供sql语句&#xff0c;也不需要提供方法体&#xff09; 2、Query查询&#xff08;半自动&#xff1a;提供 SQL 或 JPQL 查询&#xff09; 3、自定义查询&#xff08;全手动&#xff09; ★ 自定义查询&#xff08…