索引失效了?看看这几个常见的原因

news2024/11/15 18:38:20

索引是 MySQL 数据库中优化查询性能的重要工具,通过对查询条件和表数据的索引,MySQL可以快速定位数据,提高查询效率。但是,在实际的数据库开发和维护中,我们经常会遇到一些情况,导致索引失效,从而使得查询变得非常缓慢,甚至无法使用索引来优化查询,这会严重影响系统的性能。那么,是什么原因导致了索引失效呢?

常见的情况有:

  • 索引中断
  • 数据类型不匹配
  • 查询条件使用函数操作
  • 前模糊查询
  • OR 查询
  • 建立索引时使用函数
  • 索引区分度不高

下面我通过实际的例子来具体说说。假设现在我们有一张人物表,建表语句如下:

CREATE TABLE `person` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) NOT NULL,
  `score` int(11) NOT NULL,
  `age` int(11) NOT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;

1、联合索引中断

在使用联合索引进行查询时,如果联合索引中的某一个列出现了索引中断的情况,那么整个联合索引都会失效,无法继续使用索引来优化查询。

例如:对于联合索引 (name, score),如果条件中如果只有 score,则会导致索引失效。

CREATE INDEX idx_name_score ON person  (`name`,`score`);
select * from person where score = 90

而下面的情况都会使用索引:

select * from person where name = '31a'
select * from person where score = 90 and name = '31a'
select * from person where name = '31a' and score = 90

2、数据类型不匹配

如果我们在查询条件中使用了一个不匹配索引的数据类型的值,那么 MySQL 将无法使用该索引来优化查询,从而导致索引失效。

例如:如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则会导致索引失效。

CREATE INDEX idx_name ON person (`name`);
-- 这里 name 是 varchar 类型
select * from person where name = 31

但是如果索引是 int 类型,而查询参数是 varchar 类型,因为字符串隐式转为数值,不存在歧义,所以会走索引。

CREATE INDEX idx_age ON person (`age`);
-- 这里 age 是 int 类型
select * from person where age = '90'

MySQL 为什么不把 31 隐式转换字符串呢?这个问题在 MySQL 官方文档中给出了答案。

针对数值1,与字符串’1’, ‘1a’, ‘001’, '1 '等多种情况均相等,会存在歧义。不妨看个例子:

我们插入两条数据:

INSERT INTO test.person (id, name, score, age, create_time) VALUES(1, '00031', 90, 18, '2023-04-15 16:29:39');
INSERT INTO test.person (id, name, score, age, create_time) VALUES(2, '31a', 96, 19, '2023-04-15 16:29:39');

然后执行查询操作:

select * from persion where name = 31;

3、查询条件使用函数操作

当我们在查询条件中使用函数操作时,这将导致索引失效。例如:

CREATE INDEX idx_name ON person (`name`);
select * from person where UPPER(name) = '31A';

4、前模糊查询

如果我们在查询条件中使用了前模糊查询,那么 MySQL 将无法使用 B-Tree 索引的前缀匹配查询,从而导致索引失效。例如:

CREATE INDEX idx_name ON person (`name`);
select * from person where name LIKE '%a';

5、OR 查询

当我们在查询条件中使用 OR 连接多个条件时,OR 前后条件都包含索引则走索引,OR 前后有一个不包含索引则索引失效。例如:

CREATE INDEX idx_age ON person (`age`);
select * from person where name = 'John' OR age > 20;

6、建立索引时使用函数

如果在建立索引时使用了函数操作,即使使用了索引列,索引也不会生效。例如:

CREATE INDEX idx_name ON person (LOWER(name));
-- 如果使用 LOWER(name) 函数建立索引,那么下面查询将导致索引失效
select * from person where name = 'John';

7、索引区分度不高

如果索引列的值区分度不高,MySQL 可能会放弃使用索引,选择全表扫描,导致索引失效。例如我们创建了下面两条索引:

CREATE INDEX idx_name ON person (`name`);
CREATE INDEX idx_create_time ON person (`create_time`);

然后插入 100000 条数据:

create PROCEDURE `insert_person`()
begin
    declare c_id integer default 3;
    while c_id <= 100000 do
	    insert into person values(c_id, concat('name',c_id), c_id + 100, c_id + 10, date_sub(NOW(), interval c_id second));
	    set c_id = c_id + 1;
    end while;
end;
CALL insert_person();

接着执行:

explain select * from person where NAME>'name84059' and create_time>'2023-04-15 13:00:00'

结果如下:

通过上面的执行计划可以看到:type=All,说明是全表扫描。

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

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

相关文章

Vue安装

Vue安装 一、安装二、使用步骤1.在项目中使用vue2.使用命令创建vue项目 一、安装 安装vue之前需要安装nodeJS 1.需要安装Node.js。可以从官方网站进行下载并安装。 2.这篇博客有详细的步骤 Node.js安装详解 3.或者在官网安装最新版本的不用配置Node.js下载官网 安装完成Nod…

Python每日一练(20230424)

目录 1. 滑动窗口最大值 &#x1f31f;&#x1f31f;&#x1f31f; 2. 用栈实现队列 &#x1f31f; 3. 直线上最多的点数 &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一…

准确率,精确率,召回率,F1,AUC

以西瓜数据集为例&#xff0c;我们来详细解释一下什么是TP、TN、FP以及FN。 一、基础概念 TP&#xff1a;被模型预测为正类的正样本 TN&#xff1a;被模型预测为负类的负样本 FP&#xff1a;被模型预测为正类的负样本 FN&#xff1a;被模型预测为负类的正样本 二、通俗理解&am…

如何在 Linux 中查找文件所有者?

在 Linux 系统中&#xff0c;每个文件和目录都有一个所有者&#xff08;owner&#xff09;和一个所属组&#xff08;group&#xff09;。所有者通常是创建该文件或目录的用户&#xff0c;而所属组通常是文件或目录所属的组。在某些情况下&#xff0c;您可能需要查找特定文件或目…

前端学习--Ajax(5) Http

一、Http简介 1.1 通信 信息的传递和交换 通信三要素&#xff1a;主体&#xff08;双方&#xff09;、内容、方式 1.2 通信协议 通信双方通信遵守的规则 http--超文本传输协议&#xff1a;客户端与服务器之间进行网页内容传输时必须遵守的传输格式 1.3 HTTP 交互模型&a…

C++矩阵运算QT应用之Eigen库

前言 本文主要描述在c中应用Eigen进行矩阵&#xff08;向量&#xff09;的表示运算&#xff0c;以及Eigen库的下载和配置。 一. Eigen库介绍、下载及配置 Eigen是C中可以用来调用并进行矩阵计算的一个库&#xff0c;里面封装了一些类&#xff0c;需要的头文件和功能如下&…

Vue:Ajax跨域和axios简单使用

1、 第三方库方式&#xff0c; 基于 Promise 的 HTTP 库&#xff1a;axios &#xff08;对 XMLHttpRequest进行的封装&#xff09; 即&#xff1a; axios.get().then() 2、跨域访问 定义&#xff1a;在 a 页面中想获取 b 页面中的资源&#xff0c;如果 a 页面和 b 页面…

DevOps 与研发效能专家张乐:研发效能的升维思考与降维执行

在 4 月 20 日举行的《中国企业软件研发管理白皮书》发布会上&#xff0c;DevOps 与研发效能资深技术专家张乐老师做了一场名为《研发效能的升维思考和降维执行》的主题演讲&#xff0c;阐述了如何系统化思考研发效能的关键要素、互动结构及实施路径&#xff0c;并将其与落地执…

程序员应该具备哪些良好的编程习惯?

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 培养一个好的编程习惯&#xff0c;能让你整个职业生涯收益。 例如&#xff0c;做好注释&#xff0c;方便自己也方便别人读懂代码&#x…

hot100:数组——56、64

56. 合并区间 首先考虑只有两个区间的情况&#xff1a; 但是这6种情况可以合并成3种情况&#xff0c;就是上面的3种。首先先判断第一个区间的起始位置是否小于等于第二个区间的起始位置。如果不成立&#xff0c;则交换两个区间。 再考虑n个区间的情况&#xff0c;先将他们根…

QML中【预计符号】和【Unknown Component M300】的红色警告解决方法

问题描述&#xff1a; QML的项目中带中文&#xff0c;每次打开项目都在问题栏显示【预计符号】的红色警告&#xff0c;还有一种是【Unknown Component M300】的警告&#xff0c;代码能正常编译和运行。像我这样对代码追求优雅的强迫症患者看着很不爽&#xff0c;查了很多网上的…

深度强化学习——蒙特卡洛算法(6)

注&#xff1a;本章的内容作为补充插曲&#xff0c;大家可以选看&#xff0c;不过还是建议把最后一个使用蒙特卡洛近似求期望稍微看一下 蒙特卡洛是一大堆随机算法&#xff0c;通过随机样本来估算真实值 使用随机样本来近似Π 1、在[a,b]做随机均匀抽样&#xff0c;抽出n个样…

软件工程开发文档写作教程(02)—开发文档的分类

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文参考资料&#xff1a;电子工业出版社《软件文档写作教程》 马平&#xff0c;黄冬梅编著 开发文档分类概述 软件项目实施过程中依据功能和作用的不同可以把文档分为以下几…

通过Python的filestools库给图片添加全图水印

文章目录 前言一、filestools库简介二、安装filestools三、查看filestools版本四、图片添加全图水印1.引入库2.添加水印3.效果 五、参数调整对比1.水印颜色1.1通过名称设置颜色1.2通过RGB值设置颜色1.3通过十六进制设置颜色 2.水印字体的大小3.水印的透明度4.水印直接的间隔5.水…

图像工程课堂记录

文章目录 图像工程0. 介绍0.1 数字图像处理0.2 数字图像分析0.3 数字图像理解 1. 概述1.1 图像的概念1.2 图像的特点1.3 数字图像的概念1.3.1 模拟图像1.3.2 数字图像1.3.3 像素 1.4 数字图像的分类1.5 数字图像的应用领域1.6 图像工程1.7 数字图像技术研究内容1.7.1 图像获取1…

如何构建超现实元宇宙空间

元宇宙是运用数字技术构建的&#xff0c;由现实世界映射或超越现实世界&#xff0c;可与现实世界交互的住自世界&#xff0c;具备新型社会体系的数字生活空间。元宇宙通过扩展现实技术提供沉浸式体验&#xff0c;基于数字孪生技术生成现实世界的镜像&#xff0c;是区块链技术搭…

【数学建模】状态转移模型的理解与应用

文章目录 初识状态转移模型&#xff1a;人狼羊菜渡河问题状态转移模型的结论状态转移模型的应用&#xff1a;n人过桥问题 直接讲理论不太容易懂&#xff0c;所以我们通过一个例子来具体讲解一下这个模型 初识状态转移模型&#xff1a;人狼羊菜渡河问题 人狼羊菜问题应该是很经…

理解FPGA的基础知识——同步电路设计

同步电路设计将系统状态的变化与时钟信号同步&#xff0c;并通过这种理想化的方式降低电路设计难度。同步电路设计是 FPGA 设计的基础。 触发器 触发器&#xff08;Flip Flop&#xff0c;FF&#xff09;是一种只能存储1个二进制位&#xff08;bit&#xff0c;比特&#xff09;…

​如何实现一个工业级哈希表​

1、避免散列表碰撞攻击 在极端情况下&#xff0c;攻击者通过精心构造的数据&#xff0c;使得所有的数据都散列到同一个槽里&#xff0c;如果使用链表冲突解决方法&#xff0c;散列表就会退化为链表&#xff0c;查询时间复杂度就从 O(1) 退化为 O(n)。 可能因为查询操作消耗大量…

Qt 制作小程序登录系统(超详细)

在这里我使用的是 Qt4, 在 windows 平台上来实现的。 文章目录 前言一、基本部件的创建二、主界面的绘制&#xff1a;1. 设置各部件文本&#xff1a;2. 界面布局&#xff1a; 三、 信号处理机制四、Qt4 显示汉字:1. 出现乱码现象2. 解决方法 五、设置标题栏的小图标总结 前言 …