MySQL - 索引详解以及优化;Explain执行计划

news2024/11/19 1:31:18

 官网文档

MySQL :: MySQL 5.7 Reference Manual :: 8.3 Optimization and Indexes

Mysql优化(出自官方文档) - 第八篇(索引优化系列)

目录

  • Mysql优化(出自官方文档) - 第八篇(索引优化系列)
    • Optimization and Indexes
    • 1 Foreign Key Optimization
    • 2 Column Indexes
      • Indexes in the MEMORY Storage Engine
    • 3 Column Indexes && Multiple-Column Indexes
    • 4 Comparison of B-Tree and Hash Indexes
      • B-Tree Index Characteristics
      • Hash Index Characteristics
    • 5 Use of Index Extensions
    • 6 Invisible Indexes
    • 7 Descending Indexes
声明:以下内容出自动力节点!!!

一、索引

(一)索引

MySQL官方对于索引的定义:索引是帮助MySQL高效获取数据的数据结构

MySQL在存储数据之外,数据库系统中还维护着满足特定查找算法的数据结构,这些数据结构以某种引用(指向)表中的数据,这样我们就可以通过数据结构上实现的高级查找算法来快速找到我们想要的数据。而这种数据结构就是索引。

索引简单理解为“排好序的可以快速查找数据的数据结构”。

MySQL中常用的的索引数据结构有BTree索引(Myisam普通索引),B+Tree索引(Innodb普通索引),Hash索引(memory存储引擎)等等

(二)索引优势

1、提高数据检索的效率,降低数据库的IO成本

2、通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗

(三)索引劣势

索引实际上也是一张表,保存了主键和索引的字段,并且指向实体表的记录,所以索引也是需要占用空间的。

在索引大大提高查询速度的同时,却会降低表的更新速度,在对表进行数据增删改的同时,MySQL不仅要更新数据,还需要保存一下索引文件。

每次更新添加了的索引列的字段,都会去调整因为更新带来的减值变化后的索引的信息

(四)索引使用场景

1、哪些情况需要创建索引:

1、主键自动建立唯一索引

2、频繁作为查询条件的字段应该创建索引(where 后面的语句)

3、查询中与其它表关联的字段,外键关系建立索引

4、多字段查询下倾向创建组合索引

5、查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度

6、查询中统计或者分组字段

2、哪些情况不推荐建立索引:

 1、表记录太少

 2、经常增删改的表

 3、Where条件里用不到的字段不建立索引

(五)索引分类

1、主键索引

1、表中的列设定为主键后,数据库会自动建立主键索引。

2、单独创建和删除主键索引语法:

创建主键索引语法: alter table 表名 add primary key (字段);

删除主键索引语法: alter table 表名 drop primary key;

2、 唯一索引

 1、表中的列创建了唯一约束时,数据库会自动建立唯一索引。

 2、单独创建和删除唯一索引语法:

创建唯一索引语法:alter table 表名 add unique 索引名(字段);

        或  create unique index 索引名 on 表名(字段);

删除唯一索引语法:drop index 索引名 on 表名;

​​​​​​​3、 单值索引 

即一个索引只包含单个列,一个表可以有多个单值索引。

 1、建表时可随表一起建立单值索引

 2、单独创建和删除单值索引:

创建单值索引: alter table 表名 add index 索引名(字段);

    或   create index 索引名 on 表名(字段);

删除单值索引:drop index 索引名 on 表名;

​​​​​​​4、 复合索引 

即一个索引包含多个列:

 1、建表时可随表一起建立复合索引

 2、单独创建和删除复合索引:

创建复合索引:create index 索引名 on 表名(字段1,字段2);

                  或 alter table 表名 add index 索引名(字段,字段2);

删除复合索引: drop index 索引名 on 表名;

二、性能分析;Explain查看SQL执行计划

​​​​​​​(一) 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过滤

三、索引优化

(一)索引口诀

全值匹配我最爱,最左前缀要遵守;
带头大哥不能丢,中间兄弟不能断;
索引列上不计算,范围之后全失效;
LIKE百分写最右,覆盖索引不写 *;
不等空值还有or,索引失效要少用;
字符单引不可丢,SQL高级也不难。

1、全值匹配我最爱

建立几个复合索引字段,最好就用上几个字段。且按照顺序来用。

2、最佳左前缀原则

最前缀法则,必须有车头,中间车厢不能断

3、不在索引列上做任何操作(计算,函数,(自动/手动)类型转换),会导致索引失效而进行全表扫描

4、存储引擎不能使用索引中范围条件右边的列(范围之后全失效,不包括本身)

若中间索引列用到了范围(>、<、like等),则后面的索引全失效

5、尽量使用覆盖索引(尽量不用*)

6、like左模糊查询会导致索引失效

有时候右模糊查询,并不能查到想得到的内容;如果想需要使用两边都是%号,又不想索引失效,
此时应使用覆盖查询(查询范围在已经建立的索引范围之内,尽量与索引的个数,顺序相同)

使用select *

使用覆盖查询

7、is null 和 is not null将无法使用索引

8、字符串不加引号,索引失效

9、少用or,用它连接会可能会造成索引失效

(二)排序,分组优化 

1、尽量避免使用Using FileSort方式排序。

2、order by语句使用索引最左前列或使用where子句与order by子句条件组合满足索引最左前列。

3、where子句中如果出现索引范围查询会导致order by索引失效

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

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

相关文章

详解numpy.meshgrid()方法使用

这篇文章主要介绍了详解numpy.meshgrid()方法使用&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值。 一句话解释numpy.meshgrid()——生成网格点坐标矩阵。 网格点是什么&#xff1f;坐标矩阵又是什么鬼&#xff1f;看个…

公司员工的销售微信号如何管理?

在当今数字化时代&#xff0c;微信已成为企业营销的重要工具之一。其中&#xff0c;公司员工的销售微信号更是企业拓展业务、提高品牌知名度的重要途径。然而&#xff0c;如何有效管理这些销售微信号&#xff0c;确保其正常运行并避免潜在风险&#xff0c;已成为许多企业面临的…

IOI车机系统刷机和改包笔记2 - 改包脚本

前言&#xff1a; 最近对雪佛兰改包需求感兴趣的网友很多&#xff0c;大家都遇上了很多奇怪的问题&#xff0c;这里就我自己使用的环境和脚本进行分享&#xff0c;供大家参考。 1. 准备环境 我这里使用Ubuntu系统进行操作 andyandy-vm:~$ sudo lsb_release -a No LSB module…

Web3 React项目Dapp获取智能合约对象

上文Web3 整理React项目 导入Web3 并获取区块链信息中&#xff0c;我们在react搭建的dapp中简单拿到了我们区块链中的账号授权信息 那 我们继续 先终端运行 ganache -d将ganache环境起起来 然后 我们运行 dapp 拿到授权列表 回到上文结束的一个状态 然后 我们发布一下自己的…

Qt 常用方法 获取磁盘总大小、可用空间、文件夹大小 文件大小B KB M G转换

1.通过QFile获取文件大小 注意&#xff1a;返回的是字节个数 QFile file("E:/59.raw");if (file.open(QIODevice::ReadOnly)) {qDebug() << file.size();// byte} else {qDebug() << "文件打开失败&#xff01;";} 通过QFileInfo获取文件大小…

初识CSS层叠样式表

文章目录 CSS介绍CSS层叠样式表1.CSS组成2.CSS语法结构3.注释语法4.引入CSS的多种方式 CSS选择器1.CSS基础选择器2.CSS组成选择器3.分组与嵌套4.CSS属性选择器5.CSS伪类选择器6.CSS伪元素选择器 选择器优先级CSS继承选择器的优先级 CSS样式调节字体样式文本颜色文本属性 边框di…

c++从入门到放弃,小白踩坑记录1

c从入门到放弃,小白踩坑记录1 错误问题描述 没有与这些操作数匹配的运算符操作数类型为std::basic_ostream <char,std::char traits <char > > < < <unknown-type > 错误代码 #include<iostream> int main(void) {std::cout << "…

从小白到精通:揭秘perf工具的全部功能与操作技巧

揭秘perf工具的全部功能与操作技巧 一、引言二、理解perf工具的基本概念三、安装与配置perf工具3.1、不同操作系统的perf工具安装3.2、perf工具的配置选项和环境设置 四、perf工具的常用命令和功能4.1、perf工具的基本命令结构和常用参数4.2、perf工具的常见用法和功能4.3、per…

医学AI智能导诊系统源码

医院智能导诊系统是一款基于人工智能和大数据技术开发的医疗辅助软件&#xff0c;旨在为患者提供更加便捷、精准的医疗服务。 一、什么是智能导诊系统&#xff1f; 智能导诊系统是一种基于人工智能和大数据技术开发的医疗辅助软件&#xff0c;它能够通过对患者的症状、病史等信…

Qt扫盲-QFontDatabase理论

QFontDatabase理论 一、概述二、常用功能 一、概述 QFontDatabase 类提供有关底层窗口系统中可用字体的信息。 这个类最常见的用途是查询数据库中的字体系列列表()以及每个系列可用的 pointSizes() 和 styles()。pointSizes() 的另一种替代方法 是smoothSizes()&#xff0c;它…

使用传感器融合的前方碰撞预警-(Forward Collision Warning Using Sensor Fusion)

这个例子matlab自动驾驶工具箱中关于使用传感器融合的前方碰撞预警-(Forward Collision Warning Using Sensor Fusion)例子&#xff0c;其展示了如何通过融合视觉和雷达传感器的数据来跟踪车辆前方的物体&#xff0c;从而实现前向碰撞预警系统的开发与验证。 1 概述 前方碰撞…

Java体系性能测试进阶必须了解的知识点——Thread Dump

Thread Dump定义 Java Thread dump记录了线程在jvm中的执行信息&#xff0c;可以看成是线程活动的日志。Java线程转储文件有助于分析应用程序和死锁情况中的瓶颈。Thread Dump是非常有用的诊断Java应用问题的工具。它提供了当前活动线程的快照及JVM中所有Java线程的堆栈跟踪信…

【计算机网络】传输层——TCP

目录 1.概念2.可靠性概念3.TCP协议格式序号和确认序号窗口大小六个标志位 4.TCP可靠性保障确认应答机制&#xff08;ACK&#xff09;超时重传机制连接管理机制流量控制拥塞控制 5.TCP提高性能滑动窗口延迟应答捎带应答 6.面向字节流7.粘包问题8.TCP异常情况9.TCP总结 1.概念 T…

MES 价值点之数据追随

在现代制造业中&#xff0c;数据追溯已经越来越得到重视&#xff0c;特别是那些推行精益生产的企业重要性就更加突出了&#xff0c;而制造执行系统&#xff08;MES&#xff09;作为一种关键的生产管理工具&#xff0c;是能很好的为制造企业提供数据追溯功能。今天&#xff0c;和…

基因家族扩张与收缩分析-CAFE5

CAFE(Computational Analysis of gene Family Evolution)是一款以解释系统发育历史的方式分析基因家族大小变化的软件&#xff0c;这种分析常被称为基因家族收缩扩张(Gene family expansions and contractions)分析。 CAFE使用出生和死亡过程来模拟用户指定的系统发育树中的基…

剑指JUC原理-7.线程状态与ReentrantLock

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

Linux的开发环境安装配置与后端项目部署

目录 一.安装开发环境 1.准备阶段 1.1 创建新目录 1.2 解压文件 2.JDK的安装与配置环境变量 2.1 解压jdk压缩包 2.2 配置环境变量 2.3 设置环境变量生效 2.4 验证是否安装成功 3.Tomcat的安装与使用 3.1 解压安装 3.2 开启服务 3.3 开放端口 3.4 访问成功 4.MySQ…

Python的错误和异常处理

一、错误和异常 编程中出现的错误大致可以分为两类&#xff1a;错误和异常。 (一)错误 错误又可以分为两类&#xff1a;语法错误和逻辑错误。 1. 语法错误 语法错误又称解析错误&#xff0c;它是指在编写程序时&#xff0c;程序的语法不符合Python语言的规范&#xff0c;导致…

虚拟机和Windows的文件传输

拖拽/复制粘贴 直接将虚拟机linux系统的文件拖曳到windows桌面&#xff0c;或者直接将windows的文件拖曳到虚拟机linux系统当中&#xff0c;可以实现文件传输。当然复制粘贴方式也可以&#xff0c;但是前提是需要下载安装好VMware tools。 共享文件夹 概念&#xff1a;在Win…

阿里在盘古云存储系统中部署RDMA的经验谈

1 阿里如何进行RDMA部署 1.1 RDMA部署规划中的考虑因素 存储集群的部署规划控制着网络拓扑结构、RDMA通信范围、存储节点配置等&#xff0c;必须考虑多种因素&#xff0c;包括存储容量与需求的匹配、硬件成本的控制、性能的优化、可用性和SLA风险的最小化。最终的结果是所有这…