在MySQL中使用!=还能走索引吗?

news2024/11/15 18:18:25

在MySQL中使用!=还能走索引吗?

一般情况下,我们会在一个索引上较多的使用等值查询或者范围查询,此时索引大多可以帮助我们极快的查询出我们需要的数据。

那当我们在where条件中对索引列使用!=查询,索引还能发挥他的作用吗?

以此SQL为例:select * from t where k != 6;

MySQL会如何执行这个SQL呢?是直接全表扫描吗?

其实,走不走索引,只取决于一个因素,那就是成本。

我们知道,MySQL中有一个叫做优化器的东西,他会对每一条查询sql做成本分析,然后根据分析结果选择是否使用索引或者全表扫描。

对于上面的sql,优化器会将k!=6转化为两个区间查询(-∞,6)和(6,+∞),然后对索引树进行成本计算。

我们画一个简略版的二级索引树。
在这里插入图片描述
简单解释一下:每个颜色代表一个数据页(MySQL与磁盘交互是以页为单位,默认一个页是16kb,这里我们假设一个页存两条数据,并且MySQL规定页中的数据会有序排放并组成一个单向链表)。

对于一个普通的二级索引,叶子节点存储是索引列和主键值,非叶子节点页存储是下方叶子节点的最小值和对应的页地址。(叶子节点是有序的,对应的主键可不一定)

那么对于两个区间查询(-∞,6)和(6,+∞)意味着什么呢?
在这里插入图片描述
如果一个二级索引树的数据简化为12条数据,那么就有1-5,7-12共计11条数据要被扫描,然后进行11次回表。

也就是说,如果表中有120万条数据,要回表110万次。

emm,MySQL一看这么麻烦,还扫描什么二级索引树啊,直接全表扫描走起吧。

那难道说,对于!=查询就用不了索引了吗?

如果数据集是下面这种,情况可能就不一样了。

在这里插入图片描述
在这个索引树上,索引值为6的占据了很大一部分,那么MySQL扫描成本就会大大降低了。

在这里插入图片描述
此时扫描的行数变成了1,10-12,共计3行。

相对于全表扫描,此时走二级索引树扫描,显然代价是比较低的。

也就是说,对于!=是否可以使用索引,要看具体的场景。

总结一下就是,MySQL判断某个sql是否走索引,其实取决于成本分析。

如果使用二级索引的成本更低,MySQL就会倾向于使用二级索引。

如果使用二级索引扫描的行数占比过高,导致需要频繁的回表,MySQL经过计算之后觉得走二级索引的代价太大了,就会使用全表扫描。

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

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

相关文章

基于SSM的网上宠物店商城交易系统

基于SSM的网上宠物店商城交易系统~ 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 前台界面 详情界面 登录界面 管理员界面 摘要 基于SSM框架的网上宠物店商城交易系统…

Vue-1.8生命周期

Vue生命周期 一个Vue实例从创建到销毁的整个过程。 生命周期: 1)创建:响应式数据 ->发送初始化渲染请求 2)挂载:渲染数据->操作dom 3)更新:数据修改,更新视图 4&#xf…

M4Singer CUDA error: no kernel image is available for execution on the device

操作系统Ubuntu 22.04 2060 上整合好的M4Singer&#xff0c;拷贝到Ubuntu 22.04 4060ti16G上运行报错 Traceback (most recent call last): File "data_gen/tts/bin/binarize.py", line 20, in <module> binarize() File "data_gen/tts/bin/bi…

UDP协议(UDP协议特点 UDP的报文格式 UDP的服务端和客户端代码(简单的步骤))

目录 端口号 UDP协议 UDP协议特点 UDP 无连接 UDP 面向数据报 UDP 全双工 UDP 的报文格式 什么是校验和&#xff1f; 如何基于校验和来完成数据校验呢&#xff1f; CRC算法&#xff08;循环冗余算法&#xff09; MD5算法/SHA算法&#xff08;这里只介绍MD5算…

智能AI创作系统ChatGPT详细搭建教程/AI绘画系统/支持GPT联网提问/支持Prompt应用/支持国内AI模型

一、智能AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作…

JavaScript Web APIs第五天笔记

Web APIs - 第5天笔记 目标&#xff1a; 能够利用JS操作浏览器,具备利用本地存储实现学生就业表的能力 BOM操作综合案例 js组成 JavaScript的组成 ECMAScript: 规定了js基础语法核心知识。比如&#xff1a;变量、分支语句、循环语句、对象等等 Web APIs : DOM 文档对象模型&…

ElementUI--数据表格增删改查与表单验证

一、CRUD实现 1.1 后台CRUD编写 package com.zking.ssm.controller;import com.zking.ssm.model.Book; import com.zking.ssm.service.IBookService; import com.zking.ssm.util.JsonResponseBody; import com.zking.ssm.util.PageBean; import com.zking.ssm.vo.BookFileVo;…

arm 点灯实验代码以及现象(c语言版本)

.led.h #ifndef __LED_H__ #define __LED_H__ //构建寄存器组织结构体 typedef struct {unsigned int moder; unsigned int otyper; unsigned int ospeedr;unsigned int pupdr;unsigned int idr;unsigned int odr; }gpio_t;#define GPIOE (*(gpio_t*)0x50006000) #define G…

全图化在线系统设计

Pillars是什么 Pillars是一个Serverless全图化业务托管平台。Pillars应用全图化开发模型,提供丰富的运行时组件,支持CI/CD全生命周期项目管理,具备主动式资源优化能力。 Pillars解决什么问题 当前广告系统架构采用分布式微服务的设计理念,通过服务分治实现各组织间开发、…

java基础 API Calendar类

Calendar日历类 &#xff1a; package daysreplace;import com.sun.jdi.IntegerValue;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Calendar; import java.util.Date;public class Test {public static v…

关于AAPT2 error: check logs for details 的问题分析定位与排查解决方法

关于AAPT2 error: check logs for details 的问题分析定位与排查解决方法 现象描述1、排查2、定位3、解决 现象描述 在android studio的项目开发过程中&#xff0c;经常会遇到关于AAPT2 error: check logs for details 这种类似的问题。一般都是jar包冲突导致的&#xff0c;尤其…

无声的世界,精神科用药并结合临床的一些分析及笔记(四)

目录 关于镇静催眠药 第二代与第三代药物的主要区别 第二代镇静催眠药物 如何简单的识别 适用性 第三代镇静催眠药物 如何简单的识别 适用性 关于成瘾性 为什么会变胖&#xff1f; “开源” “节流” 哪种催眠药“劲儿”大? 第二代 BZDs 第三代 non-BZDs 用药…

【数据结构】算法效率的度量方法

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f38f;事后统计方法 &#x1f38f;事前分析估算方法 &#x1f38f;函数的渐进式增长 结语 在上篇文章中我们提到了算法的设计要求中我们要尽量满足时间效率高…

Zabbix第二部分:基于Proxy分布式部署实现Web监控和Zabbix HA集群的搭建

代理和高可用 一、基于zabbix-proxy的分布式监控1.1 分布式监控的作用1.2 数据流向1.3 构成组件 二、部署zabbix代理服务器Step1 前置准备Step2 设置 zabbix 的下载源&#xff0c;安装 zabbix-proxyStep3 部署数据库并将zabbix相关文件导入Step4 修改zabbix-proxy的配置文件&am…

【NLTK系列01】:nltk库介绍

一、说明 NLTK是个啥&#xff1f;它是个复杂的应用库&#xff0c;可以实现基本预料库操作&#xff0c;比如&#xff0c;、将文章分词成独立token&#xff0c;等操作。从词统计、标记化、词干提取、词性标记&#xff0c;停用词收集&#xff0c;包括语义索引和依赖关系解析等。 …

ntlm哈希传递

哈希传递就是ntlm哈希 概念 早期SMB协议铭⽂在⽹络上传输数据&#xff0c;后来诞⽣了LM验证机制&#xff0c;LM机制由于过于简 单&#xff0c;微软提出了WindowsNT挑战/响应机制&#xff0c;这就是NTLM LM NTLM 哈希传递攻击是针对相同密码的用户认证直接发起攻击&#xff0c…

Flex 布局中避免子元素高度被撑高

Flex 布局中避免子元素高度被撑高 Flex 布局中子元素高度容易被最高元素撑高&#xff0c;使用 align-self 可避免。 之前&#xff1a; 之后&#xff1a; /* 此处是居中对齐&#xff0c;也可使用 flex-start 顶部对齐 */ align-self: center;

SuperMap iServer 影像服务自动守护能力

作者&#xff1a;Carlo 目录 一、监控目录能力1、影像服务创建后&#xff0c;在添加影像集合时配置自动追加2、配置集合基本信息3、开启自动追加4、效果展示 二、静默切片支持计划任务1、配置影像集合静默切片任务2、配置瓦片方案3、配置静默切片计划任务4、效果展示 背景&…

leetCode 15.三数之和 双指针解法

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1&…

日常学习记录随笔-大数据之日志(hadoop)收集实战

数据收集(nginx)--->数据分析---> 数据清洗--->数据聚合计算---数据展示 可能涉及到zabix 做任务调度我们的项目 电商日志分析 比如说我们现在有一个系统,我们的数仓建立也要有一个主题 我这个项目是什么我要干什么定义方向 对用户进行分析,用户信息 要懂整个数据的流…