MySql索引失效的情况

news2024/11/14 15:13:12

文章目录

        • 1、对索引字段进行了运算或者使用了函数
        • 2、查询的数据类型与字段类型不一致
        • 3、违反了索引的最左匹配原则
        • 4、全表扫描更快
        • 5、where语句中索引列使用了负向查询,可能会导致索引失效
        • 6、索引字段可以为null,使用is null或is not null时,可能会导致索引失效
        • 参考:

1、对索引字段进行了运算或者使用了函数

  • 索引列上使用内置函数,一定会导致索引失效
	索引失效:
	mysql> select count(*) from tradelog where month(t_modified)=7;
	
	t_modified索引生效:
	mysql> select count(*) from tradelog where t_modified='2018-7-1

下面是这个 t_modified 索引的示意图。方框上面的数字就是 month() 函数对应的值。
在这里插入图片描述
如果你的 SQL 语句条件用的是 where t_modified='2018-7-1’的话,引擎就会按照上面绿色箭头的路线,快速定位到 t_modified='2018-7-1’需要的结果。

实际上,B+ 树提供的这个快速定位能力,来源于同一层兄弟节点的有序性。
但是,如果计算 month() 函数的话,你会看到传入 7 的时候,在树的第一层就不知道该怎么办了。
也就是说,对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。

  • col + 1 = 100不会走索引,col = 99会走索引
mysql> select name from tradelog where id + 1=100
改为
mysql> select name from tradelog where id =99

2、查询的数据类型与字段类型不一致

  • 例如字段id是varchar的,但是匹配的值时number类型的,数据库会进行隐式转换,也会导致不走索引
此时索引失效
select xx from xx where id = 1 等价于
select xx from xx where CAST(id AS signed int) = 1
  • 但是字段task_id是int,匹配类型是Varchar类型,索引则不会失效
EXPLAIN SELECT * FROM all_info WHERE task_id='835';

在这里插入图片描述

  • 判断类型转换
  • select “2” > 1 的结果:

如果规则是“将字符串转成数字”,那么就是做数字比较,结果应该是 1;
如果规则是“将数字转成字符串”,那么就是做字符串比较,结果应该是 0
在这里插入图片描述

3、违反了索引的最左匹配原则

  • like查询以%开头时,会导致索引失效
EXPLAIN SELECT * FROM sha1_virus_name WHERE virus_name_id LIKE '%EB801BEEEE%'; --all
改为:
EXPLAIN SELECT * FROM sha1_virus_name WHERE virus_name_id LIKE 'EB801BEEEE%'; --range
  • 索引中字段顺序为col1,col2,col3,查询的时候col1 = 1 and col3 =2 and col2 =2不会走索引,mysql8.x做了优化,即使顺序不对也会走索引
  • 违背最左匹配原则
当创建一个联合索引的时候,如(k1,k2,k3),相当于创建了(k1)(k1,k2)(k1,k2,k3)三个索引,这就是最左匹配原则。
索引失效:
select * from t where k2=2;
select * from t where k3=3;
slect * from t where k2=2 and k3=3;
仅命中k1
slect * from t where k1=2 and k3=3;

4、全表扫描更快

例表总行数10000行,col > 100 行数是9w多行,这时候走索引会遍历9W多条数据,要回表9w多次,数据库优化器就会进行评估,评估后全表扫描比索引快,就会自动变成全包扫描不走索引

5、where语句中索引列使用了负向查询,可能会导致索引失效

负向查询包括:NOT!=<>!<!>NOT INNOT LIKE,
并不绝对会索引失效,这要看MySQL优化器的判断,全表扫描或者走索引哪个成本低了。

6、索引字段可以为null,使用is null或is not null时,可能会导致索引失效

其实单个索引字段,使用is null或is not null时,是可以命中索引的,字段要设为not null并提供默认值

  1. null的列使索引/索引统计/值比较都更加复杂,对MySQL来说更难优化。
  2. null 这种类型MySQL内部需要进行特殊处理,增加数据库处理记录的复杂性;同等条件下,表中有较多空字段的时候,数据库的处理性能会降低很多。
  3. null值需要更多的存储空,无论是表还是索引中每行中的null的列都需要额外的空间来标识。
  4. 对null 的处理时候,只能采用is null或is not null,而不能采用=、in、<、<>、!=、not in这些操作符号。
    如:where name!=’shenjian’,如果存在name为null值的记录,查询结果就不会包含name为null值的记录。

参考:

https://juejin.cn/post/6844904022885793806
https://blog.csdn.net/MariaOzawa/article/details/107363136

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

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

相关文章

2022年MathorCup数学建模C题自动泊车问题解题全过程文档加程序

2022年第十二届MathorCup高校数学建模 C题 自动泊车问题 原题再现 自动泊车是自动驾驶技术中落地最多的场景之一&#xff0c;自动泊车指在停车场内实现汽车的自动泊车入位过程&#xff0c;在停车空间有限的大城市&#xff0c;是一个比较实用的功能&#xff0c;减少了驾驶员将…

又一新闻,Meta研发了超越chatGPT的新平台LLAMA

一、Meta 全新大语言模型 LLaMA 正通过种子公开发放2 月 24 日&#xff0c;Meta 公司发布了新的大模型系列 —— LLaMA&#xff08;Large Language Model Meta AI&#xff09;。Meta 宣称&#xff0c;LLaMA 规模仅为竞争对手 ChatGPT 的“十分之一”&#xff0c;但性能却优于 O…

Win10安装MySQL5.7.22 解压缩版(手动配置)方法

1.下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/5.7.html#downloads 直接点击下载项 下载后&#xff1a; 2.可以把解压的内容随便放到一个目录&#xff0c;我的是如下目录&#xff08;放到C盘的话&#xff0c;可能在修改ini文件时涉及权限问 题&#xff0c;之后…

第13章 二叉树模型及其扩展

这学期会时不时更新一下伊曼纽尔德曼&#xff08;Emanuel Derman&#xff09; 教授与迈克尔B.米勒&#xff08;Michael B. Miller&#xff09;的《The Volatility Smile》这本书&#xff0c;本意是协助导师课程需要&#xff0c;发在这里有意的朋友们可以学习一下&#xff0c;思…

lattice

Chinese NER Using Lattice LSTM 阅读笔记_Ono_online的博客-CSDN博客 【NER-1】-2018 ACL Lattice-LSTM_latticelstm代码_应有光的博客-CSDN博客 lattice model(结合上面两个博客来看) 18分钟彻底搞懂LSTM网络原理,NLP,深度学习,自然语言处理_哔哩哔哩_bilibili 如何从RNN起…

无代码时代洪流,高灵活,所见即所得

发布的《2022年中国低代码/零代码行业研究报告》表明&#xff0c;在最近的一项调查中&#xff0c;超过90&#xff05;的企业用户都希望能够使自己的产品开发更加灵活和有效&#xff0c;并且希望能够通过减少开发费用来优化其投入产出比。从众多研究机构的正面评价来看&#xff…

react-swipeable-views轮播图实现下方的切换点控制组件

本文是react通过react-swipeable-views创建公共轮播图组件的续文 上一文 我们创建了这样的一个轮播图组件 但我们已经看到的轮播图 下面都会有小点 展示当前所在的位置 但react-swipeable-views 并没有直接提供 我们需要自己去编写这个组件 我们在components下的 rotationCh…

如何用R语言在生物群落生态学中的数据统计分析?

R 语言作的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂&#xff0c;涉及众多统计分析方法。本课程以生物群落数据分析中的最常用的统计方法回归和混合效应模型、多元统计分析技术及结构方程等数量分析方法为主线&#xff0c;通过多个来…

文件变成chk如何恢复正常

许多人不知道chk文件是什么&#xff1f;其实它是用户在使用“磁盘碎片整理程序”整理硬盘后所产生的“丢失簇的恢复文件”&#xff0c;而在u盘、内存卡等移动设备读取数据过程中&#xff0c;由于断电或强制拔出也容易产生大量的chk文件。那么文件变成chk如何恢复正常呢&#xf…

A/B测试实践全总结

一:基本概念网站设计中,我们经常会面临多个设计方案的选择,比如某个按钮是用红色还是用蓝色,是放左边还是放右边。传统的解决方法通常是集体讨论表决,或者由某位专家或领导来拍板。虽然传统解决办法多数情况下也是有效的,但A/B 测试(A/B Testing)可能是解决这类问题的一个更好的…

小型双轮差速底盘双灰度循迹功能的实现

1. 功能说明 在机器人车体上安装2个 灰度传感器 &#xff0c;实现机器人按照下图所指定的路线进行导航运动&#xff0c;来模拟仓库物流机器人按指定路线行进的工作过程。 2. 使用样机 本实验使用的样机为R023e样机。 3. 功能实现 3.1 电子硬件 在这个示例中&#xff0c;我们采…

[Linux入门篇]一篇博客解决C/C++/Linux System Call文件操作接口的使用

目录 0.前言 1.C / C ->文件操作 1.1 C语言文件操作 1.1.1 C语言文件打开/关闭/写入 1.1.2 C语言文件的追加操作 1.1.3 C语言文件的读取 1.2 C语言文件操作 1.2.1 C文件打开 / 关闭 / 写入 1.2.2 C文件读取 1.2.3 文件追加 2.三个默认输入输出流 2.1 C语言中的三…

#gStore-weekly | gBuilder功能详解之项目管理

1. gBuilder介绍 我们知道知识图谱整个生命周期分为构建、存储管理与应用三个阶段。其中我们之前介绍的图数据库gStore对应解决的是知识图谱的存储与管理这个阶段问题。实际上知识图谱项目中大部分时间都花在知识图谱构建阶段&#xff0c;虽然知识图谱构建不直接体现价值&…

Hermite插值及其Julia实现

文章目录基本原理算法实现无论是Newton插值还是Lagrange插值&#xff0c;都只能在数值本身上满足插值函数与数据节点的重合&#xff0c;Hermite插值则要求其导数值相等。 基本原理 设在节点a⩽x0⩽x1⩽…⩽xn⩽ba\leqslant x_0\leqslant x_1 \leqslant\ldots\leqslant x_n\le…

ESP32使用TCP HTTP访问API接口JSON解析获取数据

ESP32使用TCP HTTP访问API接口JSON解析获取数据API接口代码解析获取时间代码烧录效果总结API接口 单片机常用的API接口基本都是返回的一串JSON格式的数据&#xff0c;这里以ESP32联网获取时间信息作为获取API数据的示例&#xff0c;以便后续移植使用。 很多功能性的API接…

UML-活动图以及PlantUML绘制

介绍 活动图&#xff08;英语&#xff1a;activity diagram&#xff09;是工作流的图形化表示。活动图主要由活动和动作构成&#xff0c;也可以支持分支选择、迭代、并行。在 UML 中&#xff0c;活动图主要用于为计算性和组织性过程&#xff08;即工作流&#xff09;建模&…

PaddlePaddle本地环境安装(windows11系统)

写在前面: 这里是关于win11安装PaddlePaddle的步骤和方法,建议参考官方的方法。截止2023年3月份,PaddlePaddle的版本是2.4.2。 官方参考:飞桨PaddlePaddle快速安装使用方法 建议使用Anaconda安装 ,关于Anaconda创建环境的可以借鉴:深度学习Anaconda环境搭建(比较全面)…

Exposure X7胶片滤镜调色插件免费版下载

ps是我们为图片进行调色的一种必要手法&#xff0c;我们可以通过添加滤镜、使用曲线、调整色相、饱和度等ps手法来对图片加以修饰。下面这篇文章就来为大家介绍一下ps调色方法主要有&#xff0c;ps调色插件怎么用的相关知识。 Exposure X7是一款特别好用的胶片滤镜模拟软件&am…

ESP32设备驱动-MicroSD Card驱动

MicroSD Card驱动 1、SDCard介绍 SD卡是Secure Digital Card卡的简称,直译成汉语就是“安全数字卡”,是由日本松下公司、东芝公司和美国SANDISK公司共同开发研制的全新的存储卡产品。SD存储卡是一个完全开放的标准(系统),多用于MP3、数码摄像机、数码相机、电子图书、AV器…

代码看不懂?ChatGPT 帮你解释,详细到爆!

偷个懒&#xff0c;用ChatGPT 帮我写段生物信息代码如果 ChatGPT 给出的的代码不太完善&#xff0c;如何请他一步步改好&#xff1f;网上看到一段代码&#xff0c;不知道是什么含义&#xff1f;输入 ChatGPT 帮我们解释下。生信宝典 1: 下面是一段 Linux 代码&#xff0c;请帮…