首页 > 其他分享 >根据EXPLAIN执行计划的Extra详细信息进行索引优化以及索引的使用原则

根据EXPLAIN执行计划的Extra详细信息进行索引优化以及索引的使用原则

时间:2024-08-23 08:55:12浏览次数:14  
标签:name Extra EXPLAIN 查询 索引 前导 Using where

一、根据EXPLAIN执行计划进行索引优化

语法 : Explain + SQL 语句 使用 EXPLAIN 关键字可以模拟优化器执行 SQL语句,根据Extra信息, 从而知道 MySQL 是如何理你的 SQL 语句的,分析 你的查询语句或者表结构的性能瓶颈。 Extra通常报的信息有以下几种:

1.Using index

查询的列被索引覆盖,并且 where 筛选条件是索引的前导列,是性能高的表现,使我们想要使用索引达成的结果,SQL查询速度会很快。一般是使用了覆盖索引 ( 索引包含了所有查询的字段 ) 。对于 innodb来说,如果是辅助索引性能会有不少提高。

2.Using where

查询的列未被索引覆盖, where筛选条件非索引的前导列,需要将查询的列加上索引,并且where 筛选条件设为索引的前导列。

3.Using where Using index

查询的列被索引覆盖,并且 where筛选条件是索引列之一但是不是索引的前导列,意味着无法直接通过索引查找来查询到符合条件的数据,需要将where 筛选条件设为索引的前导列。

4.NULL

查询的列未被索引覆盖,并且 where 筛选条件是索引的前导列,意味着用到了索引,但是部分字段未被索引覆盖,必须通过“ 回表 ” 来实现,不是纯粹地用到了索引,也不是完全没用到索引,需要将查询的列加上索引,并且where筛选条件设为索引的前导列。

5.Using index condition

与 Using where 类似,查询的列不完全被索引覆盖, where 条件中是一个前导列的范围

6.Using temporary

mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化例如explain select distinct name from actor; actor.name 没有索引,此时创建了张临时表来distinct

7.Using filesort

mysql 会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行信息。这种情况下一般也是要考虑使用索引来优化的,例如explain select * from actor order by name; actor.name 未创建索引,会浏览 actor 整个表,保存排序关键字 name 和对应的 id ,然后排序 name 并检索行记录

二、索引最佳实践

1.全值匹配

where条件进行全值匹配索引

2.最左前缀法则

如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列

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

4.存储引擎不能使用索引中范围条件右边的列

5.mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描

6.like以通配符开头mysql索引失效会变成全表扫描操作

7.is null,is not null 使用索引

8.尽量使用覆盖索引(只访问索引的查询(索引列包含查询列)), 减少select *语句

9.少用or,用它连接时很多情况下索引会失效

10.字符串不加单引号索引失效

标签:name,Extra,EXPLAIN,查询,索引,前导,Using,where
From: https://blog.csdn.net/qq_42124078/article/details/141384768

相关文章

  • 六、什么是SEO优化(搜索引擎优化)?SPA单页面应用如何实现SEO优化?
    文章目录一、什么是搜索引擎优化(SEO)二、如何实现搜索引擎优化(SEO)搜索引擎工作原理实现搜索引擎优化(SEO)三、SPA单页面实现SEO优化SPA实现SEO优化的难点分析SEO实现方案:SSR服务端渲染一、什么是搜索引擎优化(SEO)seo(SearchEngineOptimization)又称网站优化,也称搜索引......
  • Day03_0.1基础学习MATLAB学习小技巧总结(3)——矩阵的创建、引用和线性索引。
    利用暑假的时间把碎片化的MATLAB知识重新系统的学习一遍,为了在这个过程中加深印象,也为了能够有所足迹,我会把自己的学习总结发在专栏中,以便学习交流。素材来源“数学建模清风”特此说明:本博客的内容只在于总结在使用matlab中的一些小技巧,并非教程,若想系统的学习MATLAB,也可以......
  • 【待做】【整理】【域渗透系列】跨森林:Extra SID攻击
    本文选自《内网安全攻防:红队之路》由于微软将森林信任设计为安全边界,在默认情况下,即使我们完全控制了当前森林,也可能无法入侵其他受信任的森林(trustedforest)。下面介绍在非默认条件下(但也比较常见),如何入侵一个受信任的森林。在《内网安全攻防:渗透测试实战指南》(第1版)里面介绍......
  • df.iterrows() 是 Pandas 中的一个方法,用于在遍历 DataFrame 时,逐行返回每一行的索引
    df.iterrows()是Pandas中的一个方法,用于在遍历DataFrame时,逐行返回每一行的索引和数据。它生成一个迭代器,每次迭代时返回一个(index,Series)对,index是行索引,Series是该行的数据。详细解释df.iterrows():这个方法遍历DataFrame的每一行。每次迭代时,返回的是(ind......
  • 数据库MySQL之事务、索引
    目录1.概述2.事务3.索引3.1索引结构3.2操作语法1.概述场景:假如我们需要解散教学部,那么该部门下的所有员工都需要删除。如果教学部成功删除了,但员工出于某些原因(比如SQL语句写错了等)并没有删除,此时就会出现数据不一致的问题。这时我们可以通过数据库中的事务来解决。......
  • MongoDB系列之一文总结索引
    概述分类索引的分类:按照索引包含的字段数量,可分为单键索引(单字段索引)和组合索引(联合索引、复合索引)按照索引字段的类型,可以分为主键索引和非主键索引按照索引节点与物理记录的对应方式来分,可以分为聚簇索引和非聚簇索引,其中聚簇索引是指索引节点上直接包含了数据记录,而后者......
  • 2024-08-21:用go语言,给定一个从 0 开始索引的整数数组 nums 和一个整数 k,请设计一个算
    2024-08-21:用go语言,给定一个从0开始索引的整数数组nums和一个整数k,请设计一个算法来使得数组中的所有元素都大于或等于k,返回所需的最少操作次数。每次操作可以执行以下步骤:1.选择数组中最小的两个整数x和y。2.从数组中删除x和y。3.计算min(x,y)*2+max(x,y)......
  • 索引
    场景不废话直接建表:createtablet_log(idbigintauto_incrementcomment'主键id'primarykey,user_idbigintnullcomment'用户ID',eqp_numbervarchar(255)......
  • MySQL 禁止使用 HASH 索引
    在MySQL中,虽然InnoDB存储引擎默认使用的是BTREE索引,但它也支持一种特殊的自适应哈希索引(adaptivehashindex,AHI),这是InnoDB自动管理和使用的,用户无法直接控制。然而,对于内存存储引擎MEMORY(之前称为HEAP),MySQL确实允许用户显式地创建HASH索引。如果你想要在MEMORY表上使用HASH索......
  • 编写类A02,定义方法find,实现查找某字符串是否子啊字符数组中,并返回索引,如果找不到,返回-
    1publicclassHomework02{23//编写一个main方法4publicstaticvoidmain(String[]args){56String[]strs={"jack","tom","mary","milan"};7A02a02=newA02();8intin......