Mysql的索引失效
MySQL 的索引失效指的是:尽管在表上建立了索引,但在某些查询场景下,MySQL 优化器却没有利用这些索引,从而导致查询走了全表扫描,性能大大降低。下面详细说明几种常见的导致索引失效的情况及其原因:
1. 对索引列使用函数或表达式
- 问题描述:如果在 WHERE 子句中对索引列使用函数(如
LENGTH()
,SUBSTR()
,ROUND()
等)或进行算术运算(例如id+1=10
),MySQL 无法直接利用索引,因为索引中存储的是列的原始值,而非经过计算后的结果。 - 举例:
SELECT * FROM t_user WHERE LENGTH(name) = 6; SELECT * FROM t_user WHERE id + 1 = 10;
- 建议:尽量避免在索引列上直接进行函数调用或运算;如果必须使用,可以考虑使用“生成列”(virtual column)并对生成列建立索引。
2. 隐式类型转换
- 问题描述:当查询条件中传入的参数类型与索引列的定义类型不一致时,MySQL 会进行隐式类型转换,这通常会让索引失效。例如:
- 表中字段
code
定义为VARCHAR
,但查询时写作WHERE code = 101
(数字而非字符串)。
- 表中字段
- 举例:
-- 错误写法:由于 101 是数字,MySQL 需要将 `code` 列的值转换后比较,导致索引失效 SELECT * FROM t_user WHERE code = 101;-- 正确写法:使用字符串常量 SELECT * FROM t_user WHERE code = '101';
- 建议:保证查询条件的参数类型与列的数据类型一致,尽量使用相同类型的值。
3. LIKE 模糊匹配中的前置通配符
- 问题描述:B+树索引是按顺序存储的,只能有效用于前缀匹配。如果 LIKE 模式中通配符
%
出现在最前面,如LIKE '%abc'
或LIKE '%abc%'
,则无法利用索引进行快速定位。 - 举例:
SELECT * FROM t_user WHERE name LIKE '%林';
- 建议:尽量使用前缀匹配,例如
LIKE '林%'
这种写法能利用索引。
4. 联合索引的最左匹配原则
- 问题描述:对于联合索引(例如
(code, age, name)
),MySQL 只能利用索引中从最左边开始连续出现的列。如果查询条件未包含联合索引的最左边列,则无法使用整个联合索引。 - 举例:
- 如果联合索引为
(code, age, name)
,查询条件WHERE age = 21
或WHERE name = '张三'
将无法利用该索引;而查询WHERE code = '101'
或WHERE code = '101' AND name = '张三'
则能部分或完全利用索引。
- 如果联合索引为
- 建议:设计查询时尽量使条件包含联合索引的最左列;在建索引时考虑查询条件的使用顺序。
5. OR 条件导致索引失效
- 问题描述:在 WHERE 子句中使用 OR 时,如果 OR 两边的条件中有任一条件没有索引,MySQL 往往会放弃使用索引,从而走全表扫描。
- 举例:
如果SELECT * FROM t_user WHERE id = 1 OR age = 18;
age
字段没有建立索引,即使id
有索引,整个查询也可能无法利用索引。 - 建议:尽量保证 OR 条件中的每个条件都能使用索引,或考虑使用 UNION 替代 OR。
6. NOT IN 与 NOT EXISTS 等否定条件
- 问题描述:对于 NOT IN 和 NOT EXISTS 这类条件,MySQL 通常无法有效利用索引,会导致全表扫描。尤其是在普通索引字段上使用时,索引往往失效;(注意:对于主键字段有时还能利用索引,但不一定理想)。
- 建议:在设计查询时尽量避免使用 NOT IN,可考虑改写为 NOT EXISTS 或其他逻辑方式来优化查询。
7. 返回行数过多(全表扫描判断)
- 问题描述:当查询条件返回的数据量占表中记录数较大(通常超过 10%~30%)时,MySQL 优化器可能认为全表扫描比利用索引更高效,从而选择不使用索引。
- 建议:如果确实需要返回大量数据,可以尝试重新调整查询条件或优化数据结构,以降低扫描行数。
8. NULL 值的影响
- 问题描述:单列索引通常不存储 NULL 值,而复合索引则不存储全部为 NULL 的记录。在涉及
IS NULL
或IS NOT NULL
的查询中,索引的利用情况可能会受到影响。 - 建议:在设计表结构时,尽量避免让索引列允许大量 NULL 值;如果必须允许,可根据具体情况调整查询写法。
总结与优化建议
- 尽量避免在索引列上直接使用函数、表达式或进行运算;如果需要,请考虑使用生成列和函数索引(MySQL 8.0 以后支持)。
- 保持数据类型一致:确保查询条件的常量类型与表中列的类型一致,避免隐式转换。
- 优化 LIKE 查询:尽量使用前缀匹配(如
LIKE 'abc%'
),而不是左模糊(LIKE '%abc'
)。 - 联合索引设计:使用联合索引时遵循最左匹配原则,设计时考虑最常用的查询条件。
- 谨慎使用 OR 与否定条件:确保 OR 条件中的所有子条件都能利用索引,或尝试改写查询逻辑。
- 合理估算返回数据量:如果数据返回比例过高,优化器可能自动选择全表扫描,必要时可以通过调整查询条件或重构 SQL 来改善。
- 注意 NULL 的处理:合理设计字段的 NULL 属性,避免因大量 NULL 值影响索引性能。
通过合理设计表结构和索引,并注意查询语句的写法,可以大大提高 MySQL 查询的性能,避免因索引失效而带来的性能瓶颈。
相关文章:
Mysql的索引失效
MySQL 的索引失效指的是:尽管在表上建立了索引,但在某些查询场景下,MySQL 优化器却没有利用这些索引,从而导致查询走了全表扫描,性能大大降低。下面详细说明几种常见的导致索引失效的情况及其原因: 1. 对索…...

现代前端框架渲染机制深度解析:虚拟DOM到编译时优化
引言:前端框架的性能进化论 TikTok Web将React 18迁移至Vue 3后,点击响应延迟降低42%,内存占用减少35%。Shopify采用Svelte重构核心交互模块,首帧渲染速度提升580%。Discord在Next.js 14中启用React Server Components后…...
set 和 map 的左右护卫 【刷题反思】
1. 相近的营业额 1.1 题目 题目描述:我们定义,一天营业额的最小波动 min { | 该天以前某一天的营业额 - 该天营业额 | } 特别的,第一天的营业额最小波动为第一天的营业额 输入描述:第一行 n (n < 32767…...

【Linux高级IO】多路转接(poll epoll)
目录 1. poll 2. epoll 2.1 epoll_ctl 2.2 epoll_wait 2.3 epoll原理 2.4 epoll的工作模式 2.5 epoll的惊群效应 使用建议 总结 1. poll poll也是实现 I/O 多路复用的系统调用,可以解决select等待fd上限的问题,将输入输出参数分离,不需要…...
Linux上用C++和GCC开发程序实现两个不同PostgreSQL实例下单个数据库中多个Schema稳定高效的数据迁移到其它PostgreSQL实例
设计一个在Linux上运行的GCC C程序,同时连接三个不同的PostgreSQL实例,其中两个实例中分别有两个数据库中多个Schema的表结构分别与第三实例中两个数据库中多个Schema个结构完全相同,同时复制两个实例中两个数据库中多个Schema里的所有表的数…...

Linux下的网络通信编程
在不同主机之间,进行进程间的通信。 1解决主机之间硬件的互通 2.解决主机之间软件的互通. 3.IP地址:来区分不同的主机(软件地址) 4.MAC地址:硬件地址 5.端口号:区分同一主机上的不同应用进程 网络协议…...

Windows在多网络下指定上网接口
Windows在多网络下指定上网接口 一、说明 设备情况:win11,同时连接了有线网和WLAN,有线网连接着NAS必须保持连接。需求:有些情况时,有线网无网络而WLAN有网,但系统仍走着有线导致无法上网。 二、方法 过…...
网络安全员证书
软考网络安全员证书:信息安全领域的黄金标准 随着信息技术的飞速发展,网络安全问题日益凸显,网络安全员的需求也日益增加。软考网络安全员证书作为信息安全领域的黄金标准,对于网络安全从业者来说具有重要意义。本文将详细介绍…...

CMU15445(2023fall) Project #4 - Concurrency Control踩坑历程
把树木磨成月亮最亮时的样子, 就能让它更快地滚下山坡, 有时会比骑马还快。 完整代码见: SnowLegend-star/CMU15445-2023fall: Having Conquered the Loftiest Peak, We Stand But a Step Away from Victory in This Stage. With unwavering…...

医疗AR眼镜:FPC如何赋能科技医疗的未来之眼?【新立电子】
随着科技的飞速发展,增强现实(AR)技术在医疗领域的应用逐渐成为焦点。医疗AR眼镜作为一种前沿的智能设备,正在为医疗行业带来深刻的变革。它不仅能够提升医生的工作效率,还能改善患者的就医体验,成为医疗科…...

Python从0到100(八十九):Resnet、LSTM、Shufflenet、CNN四种网络分析及对比
前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…...
服务器迁移记录【腾讯云-->阿里云】
准备工作 压缩/root /usr/local/nginx /data三个目录到zip,并下载到本地。 zip root.zip /root zip nginx.zip /usr/local/nginx zip data.zip /datasz root.zip sz nginx.zip sz data.zip连接mysql数据库,导出数据库结构与数据到dzs_mysql.sql 安装l…...

序列化选型:字节流抑或字符串
序列化既可以将对象转换为字节流,也可以转换为字符串,具体取决于使用的序列化方式和场景。 转换为字节流 常见工具及原理:在许多编程语言中,都有将对象序列化为字节流的机制。例如 Python 中的 pickle 模块、Java 中的对象序列化…...

面向实时性的超轻量级动态感知视觉SLAM系统
一、重构后的技术架构设计(基于ROS1 ORB-SLAM2增强) #mermaid-svg-JEJte8kZd7qlnq3E {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JEJte8kZd7qlnq3E .error-icon{fill:#552222;}#mermaid-svg-JEJte8kZd7qlnq3E .…...
4-3自定义加载器,并添加功能
一、自定义类加载器的实现步骤 继承ClassLoader类 自定义类加载器需继承java.lang.ClassLoader,并选择性地重写以下方法: findClass(String name):核心方法,用于根据类名查找并加载类的字节码。需从自定义路径(…...
Python Scrapy爬虫面试题及参考答案
目录 简述 Scrapy 框架的基本工作流程,并说明各组件的作用 Scrapy 中的 Spider、CrawlSpider 和 Rule 的作用及区别? 如何通过 Scrapy Shell 快速调试页面解析逻辑? Scrapy 的 start_requests 方法与 start_urls 的关系是什么? 解释 Scrapy 的 Request 和 Response 对象…...
Swan 表达式 - 选择表达式
ANSYS Swan 表达式支持选择(selection)表达式 case, if/then/else。选择表达式根据特定的条件选择不同的分支流。 if/then/else 表达式 if/then/else 表达式的文法如下 if expr then expr else expr 其中,首个expr 的布尔表达式,若其为 true, 则返回 …...

微信小程序:完善购物车功能,购物车主页面展示,详细页面展示效果
一、效果图 1、主页面 根据物品信息进行菜单分类,点击单项购物车图标添加至购物车,记录总购物车数量 2、购物车详情页 根据主页面选择的项,根据后台查询展示到页面,可进行多选,数量加减等 二、代码 1、主页面 页…...
javaweb将上传的图片保存在项目文件webapp下的upload文件夹下
前端HTML表单 (upload.html) 首先,创建一个HTML页面,允许用户选择并上传图片。 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>图片上传</title> </head> <…...

LabVIEW 无法播放 AVI 视频的编解码器解决方案
用户在 LabVIEW 中使用示例程序 Read AVI File.vi(路径: 📌 C:\Program Files (x86)\National Instruments\LabVIEW 2019\examples\Vision\Files\Read AVI File.vi)时发现: ✅ LabVIEW 自带的 AVI 视频可正常播放 这是…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...