sql语句性能进阶必须了解的知识点——索引失效分析

news2024/11/28 3:45:16

在前面的文章中讲解了sql语句的优化策略

sql语句性能进阶必须了解的知识点——sql语句的优化方案-CSDN博客

sql语句的优化重点还有一处,那就是—— 索引!好多sql语句慢的本质原因就是设置的索引失效或者根本没有建立索引!今天我们就来总结一下那些无效的索引设置方式进而避免大家踩坑!看到这里有的同学会问:what?设置的索引还会失效?没错!接下来就让我们细细道来,文章非常有用,建议大家收藏。

不满足最左匹配原则

建立联合索引:idx_code_age_name。

该索引字段的顺序是:

  • code

  • age

  • name

以下会走索引

select * from user where code='101';

select * from user where code='101' and age=21

select * from user where code='101' and age=21 and name='Kevin';

select * from userwhere code = '101' and name='Kevin';

以下不会走索引

select * from user where age=21;

select * from user where name='Kevin';

select * from user where age=21 and name='Kevin';

使用了select *

如果select *语句中的查询列,都是索引列,那么这些列被称为覆盖索引。这种情况下,查询的相关字段都能走索引,索引查询效率相对来说更高一些;而使用select *查询所有列的数据,大概率会查询非索引列的数据,非索引列不会走索引,查询效率非常低。

索引列上有计算

例如 select * from user where id+1=2; 索引会失效

索引类用了函数

例如 select * from user where SUBSTR(height,1,2)=17;索引会失效

字段类型不同

字段类型不同索引会失效,例如设置code 为varchar,类型使用语句select * from user where code="101" 会走索引,如果我们不小心写成select * from user where code=101,则索引失效。因为code字段的类型是varchar,而传参的类型是int,两种类型不同导致索引失效。注意有一个例外就是int类型的参数,不管在查询时加没加引号,都能走索引。

like左边包括%

目前like查询主要有三种情况:

  • like '%a'(索引无效)

  • like 'a%'(索引有效)

  • like '%a%'(索引无效)

列对比

如果把两个单独建了索引的列,用来做列对比时索引会失效。例如: select * from user where id=height

使用or关键字

要么不用or要么将or的条件列都加索引(新版本mysql8以上,mysql5.6 or 索引无效)会采用索引合并的方式优化查询。

Not in 和not exists

主键字段中使用not in关键字查询数据范围,仍然可以走索引。而普通索引字段使用了not in关键字查询数据范围,索引会失效;

not exists时,索引也会失效。

order by 的坑

前提:已经建了联合索引:idx_code_age_name。

1.配合limit一起遵循最左匹配原则

explain select * from user order by code limit 100;

explain select * from user order by code,age limit 100;

explain select * from user order by code,age,name limit 100;

注意 order by不满足最左匹配原则,不会走索引。例如select * from user order by name limit 100

2.order by还能配合where一起遵循最左匹配原则。

例如:select * from user where code='101' order by age;

3.order by后面如果包含了联合索引的多个排序字段,只要它们的排序规律是相同的(要么同时升序,要么同时降序),也可以走索引。

注意:如果使用不同的排序规则不会走索引,例如select * from user order by code asc,age desc limit 100

具体sql如下:

explain select * from user order by code desc,age desc limit 100;

4.如果某个联合索引字段,在where和order by中都有也可以走索引

explain select * from user where code='101' order by code, name;

5.如果order by语句中没有加where或limit关键字,该sql语句将不会走索引。

6.对多个索引(注意:不是联合索引)进行order by不会走索引

我的每一篇文章都希望帮助读者解决实际工作中遇到的问题!如果文章帮到了您,劳烦点赞、收藏、转发!您的鼓励是我不断更新文章最大的动力!

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

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

相关文章

160. 相交链表、Leetcode的Python实现

博客主页:🏆看看是李XX还是李歘歘 🏆 🌺每天分享一些包括但不限于计算机基础、算法等相关的知识点🌺 💗点关注不迷路,总有一些📖知识点📖是你想要的💗 ⛽️今…

从零开始制作一个桶装水小程序

随着互联网的发展,越来越多的消费者通过线上购买桶装水。为了满足这一需求,我们需要制作一个专门的小程序商城,以便用户可以方便地购买桶装水。本文将通过乔拓云平台,从零开始制作一个桶装水小程序,并详细解析制作步骤…

二、类与对象(一)

1 面向过程和面向对象初步认识 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。以洗衣服为例,通常洗衣服会经历以下过程: 而C是基于面向对象的,关注的是对象&#xff0c…

云安全—K8s APi Server 6443 攻击面

0x00 前言 在未授权的一文中,详细描述了k8s api中的8080端口未授权的问题,那么本篇主要来说6443端口的利用。 0x01 API连接攻击面 1.匿名用户访问 匿名开放方式:kubectl create clusterrolebinding cluster-system-anonymous --clusterro…

信号、进程、线程、I/O介绍

文章目录 信号进程进程通信线程可/不可重入函数线程同步互斥锁条件变量自旋锁读写锁 I/O操作阻塞/非阻塞I/OI/O多路复用存储映射I/O 信号 信号是事件发生时对进程的通知机制,可以看做软件中断。信号与硬件中断的相似之处在于其能够打断程序当前执行的正常流程。大多…

paas配置及构建问题处理

目录 CI配置在前端中的作用 为什么生产环境需要付出额外的精力,进行构建? 服务 CI 通常分为两个主要部分: 构建环境: Dockerfile 镜像: CI配置在前端中的作用 开发分为三个环境:开发环境、测试环境和生…

QMI8658A_QMC5883L(9轴)-EVB 评估板——索引博文

0.前言 【初见姿态传感器】 在做一个4轴飞行器的时候了解到有这样一个可以控制飞行器姿态的传感器,而后在哔哩哔哩看到利用姿态传感做很多很好玩的作品。目前在自己的本职工作中广泛会用姿态传感器IMU的应用。 1.博文索引 【基础内容】 【QMI8658 - 姿态传感器学习…

一次性剪辑大量视频的教程,逻辑讲解,很实用

在短视频领域,视频剪辑的效率如何提升也成为了广大短视频创作者需要解决的问题之一。批量剪辑这个词汇也不断被提起。那么该如何自学批量视频剪辑呢? 想要进行批量视频剪辑,那就先需要一款好用的软件,小编这里给大家良心推荐超级…

“优等生”宁波银行公布三季报:营利齐升,风控抵补能力持续夯实

撰稿 | 多客 来源 | 贝多财经 10月30日晚,城商行“优等生”宁波银行披露2023年三季报,在效益与规模稳步提升的同时,资产质量也保持了优异水平。 前三季度,宁波银行实现归属于母公司股东的净利润193.49亿元,同比增长1…

【生物信息学】单细胞RNA测序数据分析:计算亲和力矩阵(基于距离、皮尔逊相关系数)及绘制热图(Heatmap)

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. 读取数据集2. 质量控制(可选)3. 基于距离的亲和力矩阵4. 绘制基因表达的Heatmap5. 基于皮尔逊相关系数的亲和力矩阵6. 代码整合 一、实验介绍 计算亲和力…

新加坡公司【Trident Digital】申请1688万美元纳斯达克IPO上市

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,总部位于新加坡的Trident Digital Tech Holdings Ltd(简称:Trident Digital)近期已向美国证券交易委员会(SEC)提交招股书,申…

oracle中关于connect by的语法及实现(前序遍历树)

语法 connect by是是结构化查询中用到的,其基本语法是: 1 select … from tablename 2 start with 条件1 3 connect by 条件2 4 where 条件3; 使用示例 例: create table tree(id int,parentid int); insert into tree values(120,184); …

Apache ECharts简介和相关操作

文章目录 一、Apache ECharts介绍二、快速入门1.下载echarts.js文件2.新建index.html文件3.准备一个DOM容器用于显示图表4.完整代码展示5.相关配置 三、演示效果四、总结 一、Apache ECharts介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库,提供直观…

使用Docker Compose部署Spug并实现内网穿透远程访问

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件…

【Ubuntu】虚拟机安装系统与初始化配置

一、安装ubuntu系统 1、首先在虚拟机上安装一个虚拟机系统。 简单操作忽略,只贴出与安装linux不同的地方。 内存,处理器,磁盘等什么自己看着需要自己增加们这边不做过多说明。一直下一步,然后就安装好了。2、选择镜像位置然后启…

python自动化测试(六):唯品会商品搜索与规格选择-练习

目录 一、配置代码 二、操作 2.1 输入框“运动鞋” 2.2 点击搜索按钮 2.3 选择品牌 2.4 选择主款 2.5 适用性别 2.6 选择尺码 2.7 选择商品:(通过css的属性去匹配) 2.8 点击配送地址选项框 一、配置代码 # codingutf-8 from selen…

Netty第一部

一、select和epoll原理分析 外设设备网卡、鼠标、键盘等通过总线写到内存中,中间就有DMA拷贝,操作系统怎么知道内存中有数据了,这就需要操作系统通过中断机制确定,如果有中断信号过来,cpu会首先打断用户程序执行&…

java进行支付宝支付(沙箱环境)

目录 1.准备工作 2.idea配置文件准备 3.后端代码编写 接口1:支付订单 接口2:查询订单 接口3:订单退款 接口4:查询退款结果 接口5:获取总账单 接口6:取消订单 接口7:回调接口 定时任务…

【stata基础代码大全 】 可独立完成一篇实证

【stata基础代码大全 】 可独立完成一篇实证 用stata打开,直接替换自己需要的变量就行,小白友好❗️❗️❗️ 文件包括以下内容 一、数据预处理 二、Stata中数据的基本处理 *(1)取年份 *(2)剔除数据中的样本 *(3)生成新的变量 *(4)给变量添加标签 *(5)生…

开关电源测试过压保护的测试标准及其方法

过压保护的原理 过压保护是电压超过预定值时降低电压的一种方式,原理是通过电路中的电压检测电路来检测电路中的电压是否超过了设定的阈值,如果超过了阈值,就会触发过压保护器件,使电源断开或使受控设备电压降低,保护电…