MySql索引失效的几种原因分析

article/2025/9/30 0:49:09

测试数据准备

建表语句
CREATE TABLE t_user_demo (
id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ‘自增id’,
name VARCHAR(20) DEFAULT NULL COMMENT ‘姓名’,
phone char(11) DEFAULT NULL COMMENT ‘手机号’,
age TINYINT DEFAULT NULL COMMENT ‘年龄’,
sex CHAR(1) DEFAULT NULL COMMENT ‘性别’,
PRIMARY KEY (id),
UNIQUE KEY idx_name_phone (name, phone)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
建立一个联合索引:idx_name_phone (name, phone)

表中插入一些数据:
在这里插入图片描述

1、联合索引不满足最左匹配原则

select * from t_user_demo where name = ‘zz’ and phone = ‘13933333333’;
严格按照索引顺序执行,肯定走索引
在这里插入图片描述

select * from t_user_demo where phone = ‘13933333333’ and name = ‘zz’;
这个语句虽然没有按照索引的建立顺序,但是依旧可以走索引,因为mysql会对这样的语句进行排序优化,或者交换两个条件的顺序并不影响结果。

select * from t_user_demo where phone = '13911111111’
这个语句就不会走索引了,因为不满足最左匹配原则。
在这里插入图片描述
select * from t_user_demo where name = 'zz’
交换一下顺序,只要符合最左匹配原则,单查联合索引中的列也是可以的。
在这里插入图片描述

select * from t_user_demo where name like ‘%zz%’ and phone = ‘13933333333’;
同样最左查询条件索引中断了,也不能走索引了。
在这里插入图片描述
建立一个phone,age,name的联合索引。
CREATE INDEX idx_phone_age_name ON t_user_demo (phone,age,name);

select * from t_user_demo where phone = ‘13944444444’ and age = 15 and name = 'qq’
在这里插入图片描述
走索引没问题。

select * from t_user_demo where phone = ‘13944444444’ and age > 15 and name = ‘qq’;
在这里插入图片描述
范围条件之后的列不走索引了。

2、隐式转换

select * from t_user_demo where name = ‘zz’ and phone = ‘13933333333’;
在这里插入图片描述
select * from t_user_demo where name = ‘zz’ and phone = 13933333333;
当把phone的引号去掉,则只走一个name列的索引,这是因为发生了隐式转换,phone列是char类型需要转换成相应类型进行比较,需要注意的是如果phone是数值类型,则右边无论是带引号还是不带引号都可以走索引。
在这里插入图片描述

3、like查询

select * from t_user_demo where name like '%zz%'
左右都有%的查询,是不会走索引的。

在这里插入图片描述
select * from t_user_demo where name like 'zz%'
左边没有%的情况下,会走范围类型的索引。
在这里插入图片描述

4、索引列存在运算或者使用函数

在age列上建立索引:
CREATE INDEX idx_age ON t_user_demo (age);

select * from t_user_demo where age = 15;
走索引没问题。
在这里插入图片描述
select * from t_user_demo where age-1 = 15;
索引列存在计算,不走索引了。
在这里插入图片描述
select * from t_user_demo where ABS(age) = 15;
一样不会走索引。

5、优化器

还有一些不走索引的原因可能是因为mysql优化器的原因,优化器会去为我们找到一个最优的执行方案,然而可能这个方案就是走全表的方式,所以也就不会走索引了。

最后附上索引检查的口诀

全值匹配我最爱,最左前缀要遵守。
带头大哥不能死,中间兄弟不能断。
索引列上少计算,范围之后全失效。
Like百分写最右,覆盖索引不写星。
不等空值还有or,索引失效要少用。
VAR引号不可丢,SQL高级也不难!


http://chatgpt.dhexx.cn/article/u6GsZmrx.shtml

相关文章

MySQL索引失效场景以及解决方案

一、前言 在对SQL语句进行索引查询时会遇到索引失效的时候,对于该语句的可行性以及性能效率方面有至关重要的影响,本篇剖析索引为何失效,有哪些情况会导致索引失效以及对于索引失效时的优化解决方案,其中着重介绍最左前缀匹配原则…

MySQL索引失效的几种场景

我们都知道建立索引能够提高查询效率,那么是不是任何情况下都能提高呢,当然不是的的,下面我们就来列举一些常见的索引失效的场景。 借用上一篇文章的dm_person_info表 在card_code列没加索引的时,查询时间如下,大概都…

mysql索引失效的几种情况(总结)

索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件…

导致mysql索引失效的原因有哪些

MySQL五种索引类型 sql执行顺序 (根据sql执行顺序来优化,可以把关联表判断条件放到on后面) from on join where group by having select distinct union order by limit一、哪些字段适合建索引 二、范围查询索引失效问…

MySQL 索引失效的几种情况

前言 MySQL 中提升性能的一个最有效的方式是对数据表设计合理的索引。索引提供了高效访问数据的方法,并加快查询的速度,因此索引对查询的速度有着至关重要的影响。 使用索引可以快速定位表中的某条记录,从而提高数据库的查询的速度&#xf…

MySQL索引失效的9种情况(针对InnoDB存储引擎)

前言 MySQL中提高查询性能的最有效的方式之一就是对数据表合理的设计索引,优秀的索引的设计方案很大程度上可以提高查询的性能。 因此,索引对查询的速度有着至关重要的影响。 为了尽量的使优化器用到我们的索引方案,我们要尽量避免一些导致…

Mysql:索引失效的几种可能原因

最近闲来无事,发现自己mysql的知识点忘得差不多了,打算重新拾起来捯饬捯饬,个人觉得其中最重要的知识点还是mysql的优化问题,毕竟mysql使用方面都是很简单的东西,打算从索引方面开始学习吧。 有时候我们会发现&#xf…

详解MySQL索引失效

目录 B树结构 测试数据 索引失效的情况 没有用到索引 违反左前缀原则 范围查询断索引 like需要分情况 结果数据超过半数 B树结构 索引失效的根本原因其实就是违反了B树的结构特性,查找的时候没办法在B树上继续走下去,所以首先我们来回顾一下B树…

MySQL索引失效的场景,什么情况下会造成MySQL索引失效

目录 一、准备工作,准备sql 二、索引是什么、使用explain关键字来解析sql使用索引情况 三、索引的使用与失效场景 1.使用全部复合索引(索引正常使用) 2.最佳左前缀法则 3.在索引列上做任何操作(计算、函数、自动或手动类型转…

Mysql索引失效的总结

背景 最近生产爆出一条慢sql,原因是用了or和!,导致索引失效。于是,总结了索引失效的十大杂症,希望对大家有帮助,加油。 一、查询条件包含or,可能导致索引失效 新建一个user表,它有一个普通索…

Mysql索引失效的常见原因如何用好索引

本篇文章主要介绍了索引失效的常见原因和如何用好索引,并以案例的形式进行了说明 1 结论 1.1 索引失效的常见原因 1.2 索引失效的常见误区 1.3 索引设计的几个建议 2 准备工作 先查看我本地mysql数据库的版本: select VERSION();我这里的版本是5.5.25&#xff0…

mysql索引失效情况

1、最佳左前缀原则——如果索引了多列,要遵守最左前缀原则。指的是查询要从索引的最左前列开始并且不跳过索引中的列。 前提条件:表中已添加复合索引(username,password,age) 分析:该查询缺少username,查询…

MySQL中索引失效有哪些?

前言 在学习MySQL时,如果我们想提高一条语句查询速度,通常都会想对字段建立索引。 但是索引并不是万能的。建立了索引,并不意味着任何查询语句都能走索引扫描。 稍不注意,可能你写的查询语句会导致索引失效,从而走了…

MySQL之索引失效情况

文章目录 1 MySQL索引1.1 简介1.1.1 索引基础 1.2 SQL优化1.2.1 查看执行计划1.2.2 show profile分析1.2.3 trace 2 索引失效2.1 准备工作2.1.1 创建user表2.1.2 插入数据2.1.3 查看数据库版本 2.2 联合索引2.2.1 联合索引中索引有效2.2.2 联合索引中索引失效2.2.3 MySQL 8中索…

Mysql索引失效

一.前言 针对Mysql数据库索引失效问题网上,有很多见解和答案。最近面试也是时常会被问道的一个知识点,简单的整理一下,省的以后忘记。 二.导致索引失效的几个情况 1.模糊查询:like %;like %%通配符放在开头会导致索引失效。会进行全表扫描…

详解MySQL索引失效的几种情况

MySQL索引是提高查询效率的重要手段。索引失效会导致查询效率下降,甚至全表扫描,影响数据库性能。以下是可能导致MySQL索引失效的情况: 1. 使用or操作符 当where语句中使用or操作符并且or两边的条件涉及到至少两个字段时,MySQL无…

mysql索引失效的常见9种原因详解

目录 前言&#xff1a; 1.最佳左前缀法则 2.主键插入顺序 3.计算、函数、类型转换(自动或手动)导致索引失效 4.范围条件右边的列索引失效 5.不等于(! 或者<>)导致索引失效 6.is null可以使用索引&#xff0c;is not null无法使用索引 7.like以通配符%开头索引失效…

【第三篇】MySQL 索引失效的常见原因【重点】

1.1 概述 有时候不知道小伙伴有没有跟我一样的情况&#xff0c;明明已经建立了索引&#xff0c;但是通过explain发现语句并没有使用上索引&#xff0c;这可能是某些原因导致了我们的索引失效。所以本篇主要介绍的是索引失效的常见原因和如何用好索引&#xff0c;给有需要的朋友…

你的凭据不工作,之前用于连接到(服务器IP)的凭据无法工作,请输入新的凭据(中英文均有)

之前windows还能够访问远程桌面&#xff0c;更新了系统发现又不行了&#xff0c;所以记录一下&#xff0c;解决方案&#xff1a; 在搜索里面输入gpedit.msc&#xff0c;进入到本地组策略编辑器&#xff1a; 中文版&#xff0c;把蓝色选中的策略改为&#xff08;经典&#xff…

远程桌面提示:你的凭据不工作

<<记录>> 远程连接服务器的时候&#xff0c;一直提示“你的凭据不工作”&#xff0c;连接失败。在网上找了很多办法&#xff0c;在注册表里设置凭据&#xff0c;或是添加windows新建凭证管理器等都不行。 如下图所示&#xff1a; 解决办法&#xff1a; 在输入用户…