MySQL之索引(3)(索引基本语法、SQL执行计划、常见索引失效原因与解决方法)

目录

一、索引基本语法。

(1)创建索引。

(2)查看索引。

(3)删除索引。

(4)给多列添加组合索引。

1、何时添加索引??

2、组合索引。

二、SQL执行计划。

(1)什么是SQL执行计划?

(2)查看SQL执行计划的作用。

(3)如何使用?

1、关键字:explain(EXPLAIN)。

(4)SQL执行计划中重要字段说明。

1、select_type。

2、table。

3、type。(重点关注的列)

4、key。(重点关注的列)

5、possible_keys。(重点关注的列)

6、key_len。

7、rows。

三、索引失效??

(1)什么是索引失效?

(2)常见的索引失效原因及解决方法。

1、不符合最左前缀原则的查询。(最左匹配原则)

2、隐式类型转换导致索引失效。

3、使用了左模糊查询。

4、字符串条件并未使用引号引起来!

5、索引列直接进行加减操作。

6、对索引列进行函数操作。

7、关键字order by使用时。

(3)与索引操作有关的sql优化!


一、索引基本语法。

(1)创建索引。
  • 关键字:INDEX。
  • UNIQUE:表示是唯一索引。(其中主键索引与唯一索引都属于UNIQUE)
  • 针对于大文本——>FULLTEXT。(全文索引)

  • 索引名:index_name。
  • 给对应的字段添加索引(字段可以是一个列或多个列——联合索引)
CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name (

index_col_name,... ) ;


(2)查看索引。
  • 可以通过数据库可视工具(DataGrip)直接查看。


  • 也可以使用命令直接查看。

SHOW INDEX FROM table_name;


(3)删除索引。
  • 在实际开发时,数据库管理员会定期删除某些表的索引并且重构。这样可以删除一些“索引碎片”。
  • 还有情况就是:原先某张表的查询需求高,而现在对应增加、删除、修改的需求更多,就需要把原先的索引删除。因为索引是只提高查询效率、降低增、删、改效率

DROP INDEX index_name ON table_name;
  • 注意:取名使用关键字,尽量要避免。如果真的取了,那么使用符合``进行包裹!!


(4)给多列添加组合索引。
1、何时添加索引??
  • 添加索引:这张表查询多,增删改少。否则,不建议加
  • 给那些列加索引:where中经常出现列,order by排序的列(因为MySQL中本身就是B+树索引,是有序的),select查询的列。

2、组合索引
  • 比如某张员工信息表(emp)。其经常是员工姓名(ename)与员工工资(sal)。员工姓名(ename)与员工工作(job)。员工工作(job)与员工工资(sal)进行组合查询。

  • 所以就需要给这三个字段添加一个组合索引!

二、SQL执行计划。

(1)什么是SQL执行计划?
  • SQL执行计划(Execution Plan)是数据库系统在执行SQL查询之前,根据查询语句生成的一份详细的执行步骤说明书。
  • 这份说明书描述了数据库如何执行查询,包括数据访问路径、连接顺序、使用哪些索引、是否需要排序或聚合等操作。
  • 执行计划对于数据库性能优化至关重要,因为它可以帮助开发者和数据库管理员理解查询的执行方式,并据此进行优化。

(2)查看SQL执行计划的作用。
  • 通过分析SQL的执行计划,可以识别查询中的性能瓶颈。如全表扫描索引未被使用、过多的排序和聚合操作等,并据此进行优化。
  • 这样就可以进行调整索引策略、重写查询语句或调整数据库结构来解决对应问题。

(3)如何使用?
1、关键字:explain(EXPLAIN)。
  • 全表扫描。

  • 使用已创建的索引。


(4)SQL执行计划中重要字段说明。
1、select_type。


2、table。
  • 涉及的表名。

3、type。(重点关注的列
  • 区间索引,这是重要的列。其显示连接使用了何种类型

  • 其中从(最好——>最差)的连接类型如下显示。
  • ALL是最差的。一定要进行优化。


  • type字段可能出现的值(详细介绍)


4、key。重点关注的列
  • 实际使用到的索引。
  • 如果为NULL,则没有使用索引。如果为primary的话,表示使用了主键。

5、possible_keys。(重点关注的列
  • 指出MySQL能使用哪个索引在该表中找到行。
  • 如果是空的,没有相关的索引。这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。

6、key_len。
  • 最长的索引宽度。如果键是NULL,长度就是NULL。
  • 在不损失精确性的情况下,长度越短越好。

7、rows。
  • 显示MySQL认为它执行查询时必须检查的行数。(查询多少行)

三、索引失效??

(1)什么是索引失效?
  • 索引失效是指在进行查询操作时,数据库没有利用索引来提升查询效率而是采用了全表扫描的方式,这会大大增加查询时间和系统负担。
(2)常见的索引失效原因及解决方法。
1、不符合最左前缀原则的查询。(最左匹配原则)
  • 在使用多列索引(组合索引)时,如果查询条件没有从索引的最左列开始,索引可能会失效。

  • 如下演示。员工信息表(emp)。已经创建组合索引员工姓名(ename)、员工工作(job)、员工工资(sal)——>index_emp_ename_job_sal(组合索引)


  • 对于下面几条sql语句都是索引没有失效。
  • 因为最左匹配原则——组合索引中最左边字段ename存在就生效!

explain  select * from emp where ename ='SMITT'; #使用到索引

explain select * from emp where ename ='SMITT' and job='sxxx'; #使用到索引

explain select * from emp where ename ='SMITT' and sal>1000; #使用到索引

explain select * from emp where ename ='SMITT' and sal>1000 and job ='xxx'; #使用到索引

explain select * from emp where   sal>1000 and ename ='SMITT'; #使用到索引

  • 而下面的几个sql语句——索引就失效了。
  • 因为where中未出现最左的字段。
explain select * from emp where job ='xx' and sal>1000; #索引失效

explain select * from emp where job ='xx';  #索引失效

  • 如果select后跟的列只要是是组合索引中的单字段或多字段,且where中未出现最左的字段,索引并不会失效!

  • 也就是:如果select中查询的列满足索引出现的列,使用索引!

explain select ename from emp where job ='xx' and sal>1000; #索引未失效
explain select empno from emp where job ='xx' and sal>1000; #索引失效


2、隐式类型转换导致索引失效
  • 例如员工表(emp)的字段empno为int类型,并给它设置成唯一索引。进行select查找。int类型时不会出现问题!
  • 但修改字段empno为varchar类型会出现下面情况。(索引失效!!)
# empno: int  赋值类型不一样, 隐式转换后还是会使用索引
explain  select * from emp where empno = 7788;  # 使用索引

explain  select * from emp where empno = '7788'; # 使用索引

################################################################################

# empno: varchar   如果字段类型是文本类型, 赋值类型是int, 索引失效
explain  select * from emp where empno = 7788;  # 没有使用索引  mysql: 隐式类型转换

explain  select * from emp where empno = '7788'; # 使用索引

3、使用了左模糊查询。
  • 顾名思义:如果在like模糊查询中,以"%"或者"_"开头(前缀)都会导致索引失效因为索引无法利用模糊匹配的前缀。
# 在like模糊查询中, %,_ 出现在左边, 索引失效
explain select * from emp where ename like 'S%'; #使用索引
explain select * from emp where ename like '%S%';  #没有使用索引
explain select * from emp where ename like '_S%';  #没有使用索引

4、字符串条件并未使用引号引起来!
  • 如果字符串条件未使用单引号或双引号引起来,可能会导致索引失效。
  • 例如,如果dept_no是字符串类型,那么在查询时应该使用引号,否则可能导致索引失效。

5、索引列直接进行加减操作。
  • 索引列直接进行加减操作通常会导致索引失效!
  • 这是因为数据库的索引是基于列的值进行优化的,当列的值被修改(如加减操作)后,索引中的值与实际的数据行不再匹配,因此无法利用索引进行快速查找。
create index index_emp_comm on emp(comm);
explain select * from emp where comm=2000; # 使用索引

# 如果索引列进行加减乘除运算, 索引也失效
explain select * from emp where comm+1=2000; # 没有索引

6、对索引列进行函数操作。
  • 对索引列进行一些函数操作,都会使索引失效!
# 列使用函数, 索引失效
explain select * from emp where length(ename) = 5;

7、关键字order by使用时。
  • 在某些情况下,关键字"order by"可能会导致索引失效。
  • 所以推荐关键字"order by"后面接关键字"limit"。保证能够走索引!

8、使用关键字 IN。

  • 在有关键字"IN"的子句中,如果列表中的值过多,可能会导致索引失效。

(3)与索引操作有关的sql优化!
  • 除了给对应的字段添加索引——>对sql进行优化。
  • 还可以查看SQL的执行计划——>如看其重要变量"type"是否太低了,继续调整合适的SQL语句。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端中的 File 和 Blob两个对象到底有什么不同

JavaScript 在处理文件、二进制数据和数据转换时,提供了一系列的 API 和对象,比如 File、Blob、FileReader、ArrayBuffer、Base64、Object URL 和 DataURL。每个概念在不同场景中都有重要作用。下面的内容我们将会详细学习每个概念及其在实际应用中的用法…

一步一步从asp.net core mvc中访问asp.net core WebApi

"从asp.net core mvc中访问asp.net core WebApi"看到这个标题是不是觉得很绕口啊,但的确就是要讲一讲这样的访问。前面我们介绍了微信小程序访问asp.net core webapi(感兴趣的童鞋可以看看前面的博文有关WEBAPI的搭建),这里我们重点不关心如何…

【Linux系列】VNC安装ssh后,ssh无法登录

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

温度虽寒,其道犹变:OpenAI接口之温度参数设置为0,为何每次回复仍有不确定性?

问题描述 调用openai API,使用templature 0,每次返回的内容仍有一些不同 >>> client OpenAI( ... api_keyapi_key, ... base_urlapi_base) #第一次尝试 >>> response client.chat.completions.create(mo…

【软件测试】需求的概念和常见模型(瀑布、螺旋、增量、迭代)

1. 什么是需求 在企业中,经常会听到:用户需求和软件需求 用户需求:没用经过合理的评估,通常就是一句话(开发一个五彩斑斓的黑)软件需求:开发人员和测试人员执行工作的依据 1.2 软件需求 在工…

食品配送管理系统(源码+文档+部署+讲解)

食品配送管理系统是成品商业化项目,系统可基于源码二开。 系统概述 餐饮食品配送,包含配送人APP、下单APP、管理端等,实现订餐、配餐,用于食品店、中央厨房等订餐、团餐业务 本项目名称为食品配送系统,是针对食品配…

./bin/mindieservice_daemon启动成功

接MindIE大模型测试及报错Fatal Python error: PyThreadState_Get: the function must be called with the GIL held,-CSDN博客经过调整如下红色部分参数,昇腾310P3跑起来了7b模型: rootdev-8242526b-01f2-4a54-b89d-f6d9c57c692d-qjhpf:/home/apulis-de…

我谈维纳(Wiener)复原滤波器

Rafael Gonzalez的《数字图像处理》中,图像复原这章内容几乎全错。上篇谈了图像去噪,这篇谈图像复原。 图像复原也称为盲解卷积,不处理点扩散函数(光学传递函数)的都不是图像复原。几何校正不属于图像复原&#xff0c…

精选 Top10 开源调度工具,解锁高效工作负裁自动化

在大数据和现代 IT 环境中,任务调度与工作负载自动化(WLA)工具是优化资源利用、提升生产效率的核心驱动力。随着企业对数据分析、实时处理和多地域任务调度需求的增加,这些工具成为关键技术。 本文将介绍当前技术发展背景下的Top …

高效视觉方案:AR1335与i.MX8MP的完美结合

方案采用NXP i.MX8MP处理器和onsemi AR1335图像传感器,i.MX8MP集成四核Cortex-A53、NPU及双ISP技术。AR1335是一颗分辨率为13M的CMOS传感器。它使用了先进的BSI技术,提供了超高的分辨率和出色的低光性能,非常适合于需要高质量图像的应用。此外…

Ubuntu+ROS 机械臂拾取和放置

官方链接:https://github.com/skumra/baxter-pnp 1.下载并安装 SDK 依赖项 sudo apt-get install python-wstool python-rosdep 2.创建新的 catkin 工作区 mkdir -p ~/ros_ws/src cd ~/ros_ws/src 3.使用 wstool 下载 rosinstall 文件并将其复制到 Catkin 工作区…

论文阅读《Structure-from-Motion Revisited》

摘要 增量式地运动结构恢复是从无序图像集合中进行三维重建的一个普遍策略。虽然增量式地重建系统在各个方面上都取得了巨大的进步,但鲁棒性、准确性、完整度和尺度仍然是构建真正通用管道的关键问题。我们提出了一种新的运动结构恢复技术,它改进了目前…

基于Spring Boot的船运物流管理系统的设计与实现,LW+源码+讲解

摘要 近年来,信息化管理行业的不断兴起,使得人们的日常生活越来越离不开计算机和互联网技术。首先,根据收集到的用户需求分析,对设计系统有一个初步的认识与了解,确定船运物流管理系统的总体功能模块。然后&#xff0…

威联通Docker Compose搭建NAS媒体库资源工具NAS Tools

文章目录 一、环境配置1-1 需要的配件1-2 环境安装及配置注意:获取PUID/PGID1-3 目录位置准备总结,这里我们要做5件事备注:Docker无法下载解决办法二、登录配件,进行配件连接和配置2-1 jackett设置2-2 qBittorrent设置!!!设置文件下载地址2-3 jellyfin设置2-4 NASTools设…

Spring Boot - 扩展点 EnvironmentPostProcessor源码分析及真实案例

文章目录 概述EnvironmentPostProcessor 作用EnvironmentPostProcessor 实现和注册创建类并实现接口注册到 Spring Boot常见应用场景 源码分析1. EnvironmentPostProcessor 接口定义2. 扩展点加载流程3. 加载 EnvironmentPostProcessor 实现类4. EnvironmentPostProcessor 执行…

【eNSP】企业网络架构链路聚合、数据抓包、远程连接访问实验(二)

一、实验目的 网络分段与VLAN划分: 通过实验了解如何将一个大网络划分为多个小的子网(VLAN),以提高网络性能和安全性。 VLAN间路由: 学习如何配置VLAN间的路由,使不同VLAN之间能够通信。 网络设备配置&am…

Python 智取京东商品详情:代码秘籍大公开

介绍使用 Python 获取京东商品详情的背景和意义,强调其在数据收集和分析中的重要性。 (一)数据收集的需求 在当今数字化的商业环境中,对京东商品详情数据的需求日益增长。市场调研人员需要这些数据来了解不同产品的市场份额、价格…

[C++]——位图与布隆过滤器

目录 一、前言 二、正文 1.位图 1.1 位图概念 1.2 位图的实现 1.2.1 Set 1.2.2 ReSet 1.2.3 Text 1.3 位图的应用 2.布隆过滤器 2.1布隆过滤器的提出 2.2 布隆过滤器概念 2.3 布隆过滤器的实现 2.3.1布隆过滤器的插入 2.3.2 布隆过滤器的查找 2.3.3 布隆过滤器…

工具收集 - java-decompiler / jd-gui

工具收集 - java-decompiler / jd-gui 参考资料 用法:拖进来就行了 参考资料 https://github.com/java-decompiler/jd-gui 脚本之家:java反编译工具jd-gui使用详解

Spark的容错机制:persist持久化机制checkpoint检查点机制区别

persist持久化机制: 作用:将RDD的数据缓存到内存或磁盘中,以便在后续操作中重复使用,减少计算开销。特点: 灵活性高:可以指定不同的存储级别(如仅内存、内存和磁盘、仅磁盘等)。 数…