数据库索引失效的11种情况

MySQL中 提高性能 的一个最有效的方式是对数据表 设计合理的索引。索引提供了高效访问数据的方法,并且加快查询的速度,因此索引对查询的速度有着至关重要的影响。使用索引可以 快速地定位 表中的某条记录,从而提高数据库査询的速度,提高数据库的性能。.如果查询时没有使用索引,查询语句就会扫描表中的所有记录。在数据量大的情况下,这样查询的速度会很慢。
大多数情况下都(默认)采用 B+树 来构建索引。只是空间列类型的索引使用 R-树 ,并且MEMORY表还支持 hash索引。其实,用不用索引,最终都是优化器说了算。优化器是基于什么的优化器?基于cost开销(CostBase0ptimizer),它不是基于规则(Rule-Basedoptimizer),也不是基于 语义。怎么样开销小就怎么来。另外,SQL语句是否使用索引,跟数据库版本、数据量、数据选择度都有关系。
以下是数据库中索引失效常见的11种情况:
1、全职匹配我最爱:
假如有三个索引:索引1是对字段name添加的索引,索引2是对字段(name,class_id)添加了联合索引,索引3是对字段(name,class_id,age)添加的联合索引;
在进行查询中条件判断包含字段(name,class_id,age)时,会优先使用索引3,相当于索引1、索引2失效。
2、最佳左前缀法则:
在MySQL建立联合索引时会遵守最佳左前缀原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。
例如索引(name,class_id,age),只有查询(name),(name,class_id),(name,class_id,age)会走索引,而(class_id),(class_id,age),(age)都不会走索引。
MySQL可以为多个字段创建索引,一个索引可以包括16个字段。对于多列索引,过滤条件要使用索引必须按照索引建立时的顺序,从左到右,依次满足,一旦跳过某个字段,索引后面的字段都无法被使用。如果查询条件中没有使用这些字段中第1个字段时,多列(或联合)索引不会被使用。
3、主键插入顺序
对于一个使用 InnoDB 存储引擎的表来说,在我们没有显式的创建索引时,表中的数据实际上都是存储在 聚簇索引的叶子节点的。而记录又是存储在数据页中的,数据页和记录又是按照记录 主键值从小到大 的顺序进行排序,所以如果我们 插入 的记录的主键值是依次增大的话,那我们每插满一个数据页就换到下一个数据页继续插,而如果我们插入的,主键值忽大忽小的话,则可能会造成页面分裂和记录移位。
页面分裂和记录移位意味着: 性能损耗 !所以如果我们想尽量避免这样无谓的性能损耗,最好让插入的记录的 主键值依次递增 ,这样就不会发生这样的性能损耗了。 所以我们建议:让主键具有 AUTO_INCREMENT ,让存储引擎自己为表生成主键,而不是我们手动插入 。这样的主键占用空间小,顺序写入,减少页分裂。
4、计算、函数、类型转换(自动或手动)导致索引失效
在使用计算、函数、类型转换时,要遍历全表进行计算、函数、类型转换得到一个新的结果和条件值进行比较,所以没有使用索引。
如果给字段name创建了索引,则

#1.索引优化失效
EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE LEFT(student.name,3) = 'abc';
#索引优化生效
EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE student.name LIKE 'abc%';

5、类型转换导致索引失效
如果name是varchar类型,并创建了索引

# 数字默认转成字符串导致索引失败
EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE name=123;
# 索引优化成目标字符串,走索引
EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE name='123';

6、范围条件右边的列索引失效
例如(name,class_id,age)联合索引,查询条件name,class_id,age,如果class_id使用了范围查询,那么class_id右边的age索引失效。这里右边看的联合索引的键右边。
解决办法:新建联合索引(name,age,class_id)或(age,name,class_id),把需要范围查询的字段放在最后。
范围包括:<、<=、>、>=和 between等。
应用开发中范围查询,例如:金额查询,日期查询往往都是范围查询。应将查询条件放置where语句最后。创建的联合索引中,务必把范围涉及到的字段写在最后)
7、不等于(!= 或者<>)索引失效
要进行全表扫描
8、is null可以使用索引,is not null无法使用索引
最好在设计数据表的时候就将 字段设置为 NOT NULL 约束 ,比如你可以将INT 类型的字段,默认值设置为 0。将字符类型的默认值设置为空字符串(“”)。
同理,在查询中使用 not like 也无法使用索引,导致全表扫描。
9、like以通配符%开头索引失效
在使用LIKE关键字进行査询的査询语句中,如果匹配字符串的第一个字符为“%”,索引就不会起作用。只有“%”不在第一个位置,索引才会起作用。
【强制】页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决。
10、OR 前后存在非索引的列,索引失效
在 WHERE 子句中,如果在 OR 前的条件列进行了索引,而在 OR后的条件列没有进行索引,那么索引会失效。也就是说,OR前后的两个条件中的列都是索引时,查询中才使用索引。
因为 OR的含义就是两个只要满足一个即可,因此,只有一个条件列进行了索引是没有意义的,只要有条件列没有进行索引,就会进行 全表扫描,因此索引的条件列也会失效。
11、数据库和表的字符集统一使用utf8mb4
统一使用utf8mb4(5.5.3版本以上支持)兼容性更好,统一字符集可以避免由于字符集转换产生的乱码。不同的字符集 进行比较前需要进行转换会造成索引失效。
以下我附上宋红康老师的视频教程链接供大家详细学习
数据库索引失效的11种情况上
数据库索引失效的11种情况下

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

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

相关文章

js获取选中区域(window.getSelection的基本使用)

返回一个 Selection 对象&#xff0c;表示用户选择的文本范围或光标的当前位置。 const selection window.getSelection() 1.toString() //光标选中的文本 const selectedText selection.toString() 2.getRangeAt() //返回一个包含当前选区内容的区域对象。 selection…

数据与文字的表示方法

目录 1. 数据格式 1. 文本文件格式 2. 二进制文件格式 3. 数据库格式 4. 压缩格式 2. 数字机器码表示 整数表示 浮点数表示 3. 字符与数组的表示方法 1. ASCII&#xff08;美国信息交换标准代码&#xff09; 2. 扩展ASCII 3. Unicode 4. UTF-8&#xff08;8 位 Uni…

面试相关-接口测试常问的问题

1.为什么要做接口测试 (1)现在大多系统都是前后端分离的项目,前端和后端的进度可能不一样,那为了尽早的进入测试,前端界面没有开发完成的情况下,只要后端的接口开发完了,就可以提前做接口测试了; (2)基于安全考虑,只依赖前端进行限制,已经完全不满足系统的安全性…

Power Pivot——常用DAX 函数

常用DAX 函数 以下这些函数是 DAX 中最常用的一部分&#xff0c;通过熟练掌握这些函数&#xff0c;你可以有效地进行数据分析和建模。 聚合函数 (Aggregation Functions) SUM() 用途&#xff1a;对指定列中的所有数值求和。 语法&#xff1a;SUM() 示例&#xff1a;SUM(Sale…

重生之我要学后端01--后端语言选择和对应框架选择

编程语言 后端开发通常需要掌握至少一种编程语言。以下几种语言在后端开发中非常流行&#xff1a; Java&#xff1a;广泛用于企业级应用程序。Python&#xff1a;因其易学性和强大的库支持&#xff08;如Django和Flask&#xff09;而受欢迎。Node.js&#xff08;JavaScript&a…

电商卖家怎么快速采集复制1688全店宝贝到自己店铺?淘/猫/拼/抖都适用!

1688上面的货源品类丰富&#xff0c;很多卖家都是在这里找厂家&#xff0c;当我们找好厂家后&#xff0c;怎么将厂家店铺里所有宝贝都复制到自己店铺呢&#xff1f; 虽然1688平台本身支持铺货到其他平台&#xff0c;但一个个铺货太耗费时间了。 阿里巴巴中国站获得1688商品详…

【AI大模型RAG】深入探索检索增强生成(RAG)技术

目录 1. 引言2. RAG技术概述2.1 RAG技术的定义2.2 RAG技术的工作原理2.3 RAG技术的优势2.4 RAG技术的应用场景 3. RAG的工作流程3.1 输入处理3.2 索引建立3.3 信息检索3.4 文档生成3.5 融合与优化 4. RAG范式的演变4.1 初级 RAG 模型4.2 高级 RAG 模型4.3 模块化 RAG 模型优化技…

会计报表分析

目录 一. 会计报表的种类 \quad 一. 会计报表的种类 \quad 反应财务状况的是资产负债表 反应经营成果的是利润表 有时间点的就是静态表 动态表就是有一个区间的, 比如一年, 一个季度等

探索这些有趣的API,让你的应用与众不同

在这个由数据驱动的时代&#xff0c;我们每天都在与各种应用程序和服务互动&#xff0c;却很少意识到它们背后的技术奇迹。API&#xff0c;作为这些互动的幕后英雄&#xff0c;不仅简化了开发过程&#xff0c;还扩展了技术的边界。有趣的API&#xff0c;特别是那些能够激发创新…

QT 如何储存多种数据类型(QVariant )

QVariant 是 Qt 框架中用于存储各种数据类型的类。它提供了一个强大的类型系统&#xff0c;允许你在运行时存储和检索多种类型的数据&#xff0c;而不需要在编译时确定类型。QVariant 的主要优点在于它的灵活性和通用性&#xff0c;这使得它在 Qt 的很多组件和机制中都被广泛使…

时间戳是什么,如何使用时间戳

时间戳&#xff08;Timestamp&#xff09;是表示特定时间点的数值&#xff0c;通常以自1970年1月1日00:00:00 UTC&#xff08;协调世界时&#xff09;以来的秒数或毫秒数来表示。这个时间点被称为Unix纪元&#xff08;Unix epoch&#xff09;。时间戳广泛用于计算机系统中&…

数据结构教材关于C/C++的研究

变量 指针 引用 变量 普通变量表示一个内存空间&#xff0c;直接printf是内存空间里的值 结构体 定义一个结构体类型变量为什么必须用指针&#xff1f; 因此无法确定结构体需要多少空间&#xff0c;改用指针可以解决这个问题&#xff0c;因为指针的大小是固定的 指针 指…

HTTP协议和Nginx

一、HTTP协议和Nginx 1.套接字Socket 套接字Socket是进程间通信IPC的一种实现&#xff0c;允许位于不同主机&#xff08;或同一主机&#xff09;上不同进程之间进行通信和数据交换&#xff0c;SocketAPI出现于1983年BSD4.2实现在建立通信连接的每一端&#xff0c;进程间的传输…

binlog与redolog的区别

binlog与redolog的区别 在数据库管理系统中&#xff0c;日志系统扮演着至关重要的角色&#xff0c;它记录了数据库的所有更改&#xff0c;从而确保在发生故障时能够恢复数据。其中&#xff0c;binlog&#xff08;二进制日志&#xff09;和redolog&#xff08;重做日志&#xf…

Eureka是什么?它是如何工作的?

Eureka是Netflix开发的服务发现框架&#xff0c;现在是Spring Cloud生态系统的一部分。它主要用于AWS云平台&#xff0c;用来定位服务&#xff0c;以实现中间层服务器的负载均衡和故障转移。在微服务架构中&#xff0c;服务发现是关键的一环&#xff0c;它允许服务和服务彼此发…

理解MySQL核心技术:外键的概念、作用和应用实例

引言 在数据库管理系统&#xff08;DBMS&#xff09;中&#xff0c;外键&#xff08;Foreign Key&#xff09;是维持数据一致性和实现数据完整性的重要工具。本文将详细介绍MySQL外键的基本概念、作用&#xff0c;以及相关的操作指南和应用实例&#xff0c;帮助读者掌握并灵活…

深入了解PHP的If...Else语句

PHP是目前最流行的服务器端编程语言之一&#xff0c;用于开发动态和交互式网站。在PHP编程中&#xff0c;控制结构是非常重要的概念&#xff0c;它们决定了代码的执行流程。其中&#xff0c;if…else语句是最常用的控制结构之一。本文将深入介绍PHP中的if…else语句&#xff0c…

【Android】怎么创建一个隐藏图标的应用

项目需求 创建一个不带启动图标的app 项目实现 1.低版本上 在低版本的Android系统上面&#xff0c;可以简单使用这个,但是现在很多版本都不适用了。 <activityandroid:name".MainActivity"><intent-filter><action android:name"android.int…

算子级血缘和血缘查询管理

数据链路 血缘关系 应用场景&#xff1a;数据资产&#xff0c;数据开发&#xff0c;数据治理&#xff0c;数据安全等等 &#xff08;绿色箭头上面是数据治理&#xff09; 场景&#xff1a; 数据链路的高效盘点与理解 数仓模型的长效优化机制 风险影响的及时全面分析 重复…

linux kswapd0进程cpu占用一直居高不下

kswapd0 是 Linux 内核中的一个进程&#xff0c;负责管理虚拟内存和交换&#xff08;swap&#xff09;操作。当该进程的 CPU 占用率居高不下时&#xff0c;通常表示系统正在频繁地进行交换操作&#xff0c;可能由于内存不足或内存使用不合理。 可能原因 内存不足&#xff1a; …