一文彻底搞懂Mysql索引优化

news2025/1/17 8:49:56

专属小彩蛋:前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站(前言 - 床长人工智能教程) 

目录

一、索引介绍

二、性能分析

三、查询优化

一、索引介绍

(1)什么是mysql的索引

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

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

(2)索引数据结构

下图就是一种可能的二叉树的索引方式:

 二叉树数据结构的弊端:当极端情况下,数据递增插入时,会一直向右插入,形成链表,查询效率会降低。

MYSQL中常用的索引数据结构有BTree索引(myisam普通索引)B+Tree索引(Innodb普通索引),hash索引(memory存储索引)等等。

(3)索引优势

提高数据检索的效率,降低数据库的IO成本。通过索引对数据进行排序,降低数据排序的成本,降低了cpu的消耗。

(4)索引劣势

        索引实际上也是一张表,保存了主键和索引的字段,并且指向实体表的记录,所以索引也是需要占用空间的,在索引大大提高查询速度的同时,却会降低表的更新速度,在对表进行数据增删改的同时,mysql不仅要更新数据,还需要保存一下索引文件,每次更新添加了的索引列的字段,都会去调整因为更新带来的减值变化后的索引的信息。

(5)索引使用场景

哪些情况推荐建立索引?

  1. 主键自动建立唯一索引
  2. 频繁作为查询条件的字段应该创建索引(where后面的语句)
  3. 查询中与其他表关联的字段,外键关系建立索引
  4. 多字段查询下倾向创建组合索引
  5. 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
  6. 查询中统计或者分组字段

哪些情况不推荐建立索引?

  1. 表记录太少
  2. 经常增删改的表
  3. where条件里用不到的字段不建立索引

(6)索引分类

  • 主键索引(primary key)
  • 唯一索引(unique)
  • 单值索引(index)
  • 复合索引

二、性能分析

(1)mysql常见瓶颈

sql中对大量数据进行比较,关联,排序,分组时cpu的瓶颈。

实例内存满足不了缓存数据或排序等需要,导致产生大量的物理IO,查询数据时扫描过多数据行,导致查询效率低。

(2)Explain 执行计划

使用Explain关键字可以模拟优化器执行sql查询语句,从而知道mysql是如何处理sql语句的,可以用来分析查询语句或是表的结构的性能瓶颈。其作用:

  • 表的读取顺序
  • 哪些索引可以使用
  • 数据读取操作的操作类型
  • 哪些索引被实际使用 
  • 表之间的引用
  • 每张表有多少行被优化器查询

Explain 关键字使用起来比较简单: explain + SQL语句

 如下所示,我们查看一个多表根据id关联的sql语句执行计划。

(3)Explain 重要字段名

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

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

select_type:询的类型,常见值有:

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

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

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是从硬盘中读取的。示例:由于t1表只有id和content两个字段,并且id,content 都建立了索引,所以直接从索引文件读取数据。
  •  all: full table scan,将遍历全表来找到匹配的行。

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

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

key: 查询中实际使用的索引,如果是null,则没有使用索引。

 当 查询条件改为 is not null 时,索引失效,则possible_keys 和 key 就不一致了。

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

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

  • extra: 一些常见的重要的额外信息。
  • Using filesort:mysql 无法利用索引完成的排序操作称为“文件排序”。(代表排序字段没有使用索引,效率较低)

  • Using temporary: mysql在对查询结果排序时使用临时表,常见于排序order by 和分组查询 group by。

  • Using index:表示索引被用来执行索引键值的查找,避免访问了表的数据行,效率不错(代表查询的字段都是从索引文件获取到的)示例:从索引文件获取

  未从索引文件获取

  • Using where:表示使用了where过滤。

 三、查询优化

(1)索引失效

 专属小彩蛋:前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站(前言 - 床长人工智能教程)

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

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

相关文章

Python使用矩阵分解法推荐系统找到类似的音乐

这篇文章是如何使用几种不同的矩阵分解算法计算相关艺术家。最近我们被客户要求撰写关于的矩阵分解法推荐系统研究报告&#xff0c;包括一些图形和统计输出。代码用Python编写&#xff0c;以交互方式可视化结果。 加载数据 这可以使用Pandas加载到稀疏矩阵中&#xff1a; # r…

Jmeter 使用BeanShell断言,实现自动获取文章列表,并判断文章是否为当天发布的

系列文章目录 提示&#xff1a;阅读本章之前&#xff0c;请先阅读目录 文章目录系列文章目录前言一、正则表达式提取器&#xff0c;提取所有文章id二、循环控制器&#xff0c;读取每篇文章的创建时间三、JSON提取器&#xff0c;提取创建时间&#xff0c;然后进行判断四、运行结…

Java设计模式七大原则-里氏替换原则

里氏替换原则 OO中的继承性的思考和说明 继承包含这样一层含义&#xff1a;父类中凡是已经实现好的方法&#xff0c;实际上是在设定规范和契约&#xff0c;虽然它不强制要求所有的子类必须遵循这些契约&#xff0c;但是如果子类对这些已经实现的方法任意修改&#xff0c;就会对…

1540_AURIX_TriCore内核架构_FPU

全部学习汇总&#xff1a; GreyZhang/g_tricore_architecture: some learning note about tricore architecture. (github.com) 这一次看一下TriCore的FPU&#xff0c;浮点处理单元。说起来&#xff0c;这算是很多MCU中的一个高级模块了。 1. 在TriCore中FPU其实是可选实现的&a…

动画演示选择排序(Selection Sort)

1、排序规则 1.1 一句话总结选择排序 从数组中第一个数字开始&#xff0c;数组中每个数字都要和后面所有数字比一次大小&#xff0c;每每次循环遍历当前最小值&#xff0c;放在当前循环范围内的最小位置。当完成第 N - 1 次循环之后&#xff0c;排序完成。N 数组长度 - 1。 …

113.(leaflet篇)leaflet根据距离截取线段

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>

不同类型的 SSL 证书解释

了解不同类型的 SSL 证书&#xff1a;扩展验证 (EV)、组织验证 (OV) 和域名验证 (DV)。 查看用例及更多。 SSL/TLS 证书用于验证网站的身份并在服务器和浏览器之间创建安全连接。有许多不同类型的 SSL 证书选项可用&#xff0c;它们都有其独特的用例和价值主张。证书颁发机构 …

【项目实战合集】计算机视觉毕业设计项目怎么选,超30个经典案例供你选择...

每年到了搞毕业设计的时候&#xff0c;很多学生朋友都很头疼&#xff0c;指导老师给不了好题目&#xff0c;自己也没有什么好的想法&#xff0c;怕选的太容易了过不了&#xff0c;怕选的太难了做不出&#xff01;今年我们在计算机视觉方向出了【超过30个基于Pytorch框架】的实战…

FineReport 动态图表表格软件-函数计算组成和语法

1. 概述 1.1 版本 1.2 功能简介 在设计模板时用户需要频繁的使用公式函数&#xff0c;例如&#xff1a;求和、求个数、做判断等等。 本文介绍函数的计算组成和语法。 2. 计算语法 2.1 概览 组成部分 语法 示例 函数 函数语法详情查看对应函数&#xff1a; SUM(合同金额…

AGI意识科学每周速递 | 2022年11月第四期

AGI&意识科学每周速递 | 2022年11月第四期 心识研究院 Mindverse Research 2022-11-28 17:00 发表于上海 收录于合集#AGI&意识科学每周速递24个 本周主要内容&#xff1a;程序辅助语言模型 PAL、AI 外交官 CICERO、视觉语言图灵测试、NLP 的持续学习、胎儿的大脑皮层…

winograd卷积实践

winograd卷积基本原理参考 Winograd算法实现卷积原理_Luchang-Li的博客-CSDN博客_optimizing batched winograd convolution on gpus winograd卷积图示&#xff1a; 注意这张图里面隐藏了input和output channel。实际上每个空间维度里面还包含了batch和in/out channel维度。 …

从pom文件里面找不到对应的Maven依赖,通过下面的方法完美解决

如下&#xff0c;我想获取gson对应的依赖 第一步&#xff1a;进入引入对应包的类里面 第二步&#xff1a;进入包&#xff1a;Ctrl 左键 ctrl左键点击gson后&#xff0c;会自动跳转到这个文件夹 第三步&#xff1a;打开依赖图 按箭头点击后&#xff0c;会出现下面的依赖图 …

[附源码]Python计算机毕业设计SSM基于Java的音乐网站(程序+LW)

环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 Maven管理等…

基于java+swing+mysql北方传统民居信息管理系统

基于javaswingmysql北方传统民居信息管理系统一、系统介绍二、功能展示1.用户登陆2.用户界面3.管理员界面4.民居信息修改5.民居信息详情三、系统实现1.ManageMainFrame.java四、其它1.其他系统实现一、系统介绍 用户&#xff1a;民居信息浏览、民居详细信息 管理员&#xff1a…

CDMP证书是什么样?CDMP证书有用吗?

随着数字化经济在我国的迅速开展&#xff0c;企业越来越重视数字人才的培养&#xff0c;致使越来越多得数字人通过考取CDMP证书来证明自己的能力。而一些犹豫观望的人&#xff0c;就会问。拿到CDMP证书&#xff0c;对你们真的有用吗&#xff1f;是纸质版证书还是电子版证书&…

PHP交流管理系统wamp运行定制开发mysql数据库html网页算机软件工程

一、源码特点 PHP交流管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库系统主要采用B/S模式开发,开发环境为PHP APACHE&#xff0c;数据库为mysql5.0 &#xff0c;使用php语言开发 PHP交流管理系统wamp运…

想把iPad作为扩展屏,却发现macOS monterey随航功能不见了

居家办公最不爽的事情就是没有扩展屏&#xff0c;对于开发来说&#xff0c;效率是有影响的&#xff0c;于是便想着把iPad当作扩展屏来用 系统参数 mac&#xff1a; macOS monterey&#xff08;12.4&#xff09;&#xff1b;M1 iPad&#xff1a; iPad Pro 第2代&#xff0c;应该…

分享 2022 年最受欢迎的黑科技工具(一)

Hello, everybody &#xff0c;2022 年最受欢迎的黑科技工具&#xff08;一&#xff09;&#xff0c;收藏一波吧&#xff0c;您的在看、转发、点赞就是对tuonioooo最大的支持&#xff01; 1.Hijacker 项目地址&#xff1a;https://github.com/chrisk44/Hijacker Hijacker是渗透…

Python基础(七):条件语句深入了解

文章目录 条件语句深入了解 一、了解条件语句 二、if 语法 1、语法 2、快速体验 三、实例&#xff08;上网&#xff09; 1、简单版 2、进阶版 四、if...else... 1、语法 2、实用版&#xff1a;网吧上网 五、多重判断 1、语法 2、实例&#xff1a;工龄判断 六、…