MySQL的索引失效的原因有那些
1. 数据类型不匹配
详细说明:MySQL在比较不同数据类型的值时,可能会尝试进行隐式转换。如果这种转换导致了复杂度增加或无法直接利用索引,则会导致索引失效。
实例与解决方案:
-- 错误示例:数据类型不匹配
select * from users where id = '123'; -- id 是 int 类型,'123' 是字符串-- 正确示例:确保数据类型一致
select * from users where id = 123; -- 使用正确的数据类型-- 如果必须使用字符串输入,可以显式转换
select * from users where cast(id as char) = '123';
解决方案:确保查询条件中的值与列的数据类型相匹配。如果必须使用不同类型的值,请显式地进行类型转换。在应用层面上,确保传入数据库的参数类型正确。
2. 隐式转换
详细说明:隐式转换是指 mysql 自动将一个数据类型转换为另一个数据类型。这种转换可能改变原始的查询模式,导致索引失效。
实例与解决方案:
-- 错误示例:隐式转换
select * from users where age = 25 + 0.0; -- 强制浮点数运算-- 正确示例:避免不必要的数学运算
select * from users where age = 25; -- 直接使用整数
解决方案:尽量保持查询条件简单明了,避免不必要的数学运算或其他可能导致隐式转换的操作。编写SQL语句时,确保数据类型一致性。
3. 函数或表达式
详细说明:对索引列应用函数或复杂的表达式会阻止 mysql 使用该索引,因为它需要计算每一行的结果,从而失去了索引的优势。mysql 8.0 引入了表达式索引(也称为函数索引),可以在某些情况下帮助缓解这个问题。
实例与解决方案:
-- 错误示例:索引列上使用函数
select * from articles where length(title) > 10;-- 改进方法(取决于需求)
select * from articles where title like '___________%'; -- 假设标题至少有11个字符-- 或者创建表达式索引(mysql 8.0+)
create index idx_title_length on articles ((length(title)));
select * from articles where length(title) > 10;
解决方案:尽可能避免在索引列上使用函数。如果必须这样做,请考虑创建表达式索引或重新设计查询逻辑。对于较老版本的MySQL,重构查询以避免使用函数可能是唯一的选择。
4. 范围查询之后的列
详细说明:在复合索引中,一旦出现了范围条件,mysql 就不能再使用后续的索引部分,因为这些部分不再能够有效地缩小搜索范围。复合索引的设计应该考虑到查询模式。
实例与解决方案:
create index idx_name on table (col1, col2);
select * from table where col1 = 'value1' and col2 > 'value2';-- 如果你经常需要基于 col2 的范围查询,可以考虑创建一个单独的索引
create index idx_col2 on table (col2);
解决方案:对于频繁使用的范围查询,应该单独为涉及的列创建索引。同时,在设计复合索引时要考虑到查询模式,尽量让等值条件先于范围条件出现。
5. like 查询
详细说明:like 模式以通配符开头时,mysql 不能使用索引来加速查询,因为它需要扫描所有可能的前缀。然而,如果通配符出现在模式的末尾,则索引仍然可以被使用。
实例与解决方案:
-- 不理想的查询
select * from names where name like '%john%';-- 改进方法(根据实际情况)
-- 如果是尾部模糊匹配,可以使用索引
select * from names where name like 'john%';-- 或者使用全文索引(适用于大量文本搜索)
alter table names add fulltext(name);
select * from names where match(name) against('john');-- 对于前缀匹配,可以使用索引覆盖
select * from names where name >= 'john' and name < 'johnz';
解决方案:尽量避免使用以通配符开头的LIKE查询。如果确实需要这样的功能,可以考虑使用全文索引或者其他专门的搜索引擎。对于前缀匹配,可以通过范围查询实现索引的有效利用。
6. or 条件
详细说明:使用 or 连接的不同列上的条件可能导致 mysql 无法有效利用索引,特别是当 or 条件跨越多个不同的列时。mysql 5.6 及以后版本支持索引合并策略,可以在某些情况下提高性能。
实例与解决方案:
-- 不理想的查询
select * from users where first_name = 'john' or last_name = 'smith';-- 改进方法(根据实际情况)
-- 如果查询频率较高,可以考虑创建组合索引
create index idx_first_last_name on users (first_name, last_name);-- 或者重构查询逻辑,如使用 union
select * from users where first_name = 'john'
union all
select * from users where last_name = 'smith';-- 利用索引合并(mysql 5.6+)
explain select * from users where first_name = 'john' or last_name = 'smith';
解决方案:评估是否可以通过创建组合索引或者重构查询逻辑来提高性能。对于某些情况,UNION可能是更好的选择。检查EXPLAIN输出,看看是否启用了索引合并。
7. 全表扫描更高效
详细说明:对于非常小的表或者返回大部分行的查询,全表扫描可能比使用索引更快,因为索引访问涉及到额外的 i/o 操作。mysql 优化器会权衡利弊,决定最合适的执行计划。
实例与解决方案:
-- 对于小表,即使有索引也可能选择全表扫描
select * from small_table;-- 对于大表,如果查询返回大量行,优化器也会倾向于全表扫描
select * from large_table where some_condition;
解决方案:理解MySQL优化器的行为,不要盲目依赖索引。有时候,对于特定的小表或高覆盖率查询,全表扫描是最佳选择。定期分析查询性能,确保优化器做出正确的决策。
8. 索引选择性低
详细说明:选择性低意味着索引列包含大量的重复值,使得索引的效果大打折扣。在这种情况下,mysql 可能会认为全表扫描更加高效。选择性高的索引可以显著提高查询性能。
实例与解决方案:
-- 性别列的选择性很低
select * from employees where gender = 'm';-- 改善方法(根据实际情况)
-- 尽量避免在低选择性的列上创建独立的索引,除非它们与其他高选择性的列一起组成复合索引
create index idx_gender_salary on employees (gender, salary);
解决方案:避免在选择性低的列上创建独立的索引。可以考虑与其他高选择性的列组合成复合索引。通过analyze table命令获取统计信息,评估索引的选择性。
9. 覆盖索引不足
详细说明:当查询中所选的列不在索引中时,mysql 必须回表获取完整行信息,这增加了额外的 i/o 成本,降低了索引的效率。覆盖索引可以显著减少读取时间。
实例与解决方案:
-- 假设有一个覆盖索引 idx_id_name 包含 id 和 name 列
select id, name, address from customers where id = 123;-- 改善方法
create index idx_id_name_address on customers (id, name, address);
解决方案:创建覆盖索引,即包括查询中所有需要的列。这样可以在索引中直接获取所需数据,而无需回表。注意,覆盖索引虽然提高了读取速度,但可能会影响写入性能,因此需要平衡考虑。
10. 统计信息不准确
详细说明:mysql 优化器依赖于表的统计信息来决定查询计划。如果这些统计数据过时或不准确,优化器可能会做出错误的决策。维护良好的统计信息对于优化查询至关重要。
实例与解决方案:
-- 分析表以更新统计信息
analyze table your_table;-- 或者使用 optimize table 来重建表并更新统计信息
optimize table your_table;-- 在 mysql 8.0 及以上版本,还可以使用系统变量控制统计信息的收集
set persist optimizer_switch='histogram=on';
解决方案:定期运行analyze table或optimize table命令来保持统计信息的准确性。这对于大型表尤其重要。在MySQL 8.0及以上版本,可以启用直方图统计信息来更好地反映数据分布。
11. 锁争用
详细说明:在高并发环境下,锁机制的存在可能导致索引效率下降,即使有合适的索引也无济于事。锁定问题不仅影响索引效率,还可能导致其他并发问题,如死锁。
实例与解决方案:
-- 在高负载系统中,频繁更新某张表可能会导致读取操作等待写锁释放
-- 解决方案包括但不限于调整事务隔离级别、优化 sql 语句减少锁定时间等。-- 降低事务隔离级别以减少锁定
set session transaction isolation level read committed;-- 使用乐观锁策略,如添加版本号列
alter table your_table add column version int default 0;
update your_table set column1 = value1, version = version + 1 where id = specific_id and version = current_version;
解决方案:优化SQL语句以减少锁定时间,考虑适当的事务隔离级别,评估是否可以使用乐观锁策略。对于高并发环境,考虑分库分表、读写分离等架构优化措施。
使用 mysql 工具进行诊断和优化
- explain:使用
explain关键字查看查询执行计划,了解 mysql 是如何处理你的查询的。 - show index:显示表的索引信息,帮助评估现有索引的有效性和适用性。
- performance_schema:监控和诊断 mysql 性能问题,包括锁定、线程状态等。
- slow query log:记录慢查询日志,找出那些执行时间过长的查询。
- information_schema:访问有关数据库元数据的信息,如表结构、索引等。
通过上述详细的讨论,我们可以看到,mysql 索引失效的问题往往可以通过合理的查询优化、索引设计和维护来解决。了解你的数据分布、查询模式以及 mysql 优化器的工作原理是构建高效数据库应用的关键。持续监控和优化数据库性能,确保索引得到充分利用,是保证应用程序响应快速和稳定的重要步骤。
相关文章:
MySQL的索引失效的原因有那些
1. 数据类型不匹配 详细说明:MySQL在比较不同数据类型的值时,可能会尝试进行隐式转换。如果这种转换导致了复杂度增加或无法直接利用索引,则会导致索引失效。 实例与解决方案: -- 错误示例:数据类型不匹配 select *…...
Java重要面试名词整理(十):Kafka
文章目录 Kafka简介相关概念Kraft集群 Kafka收发消息梳理客户端工作机制消费者分组消费机制生产者拦截器机制消息序列化机制消息分区路由机制生产者消息缓存机制发送应答机制生产者消息幂等性生产者消息事务 Kafka集群架构设计-Kafka的Zookeeper元数据梳理Leader Partition选举…...
内置ALC的前置放大器D2538A/D3308
一、概述 D2538A/D3308是芯谷科技推出的带有ALC(自动电平控制)的前置音频放大器芯片,最初产品为单声道/立体声收录机及盒式录音机而开发,作为录音/回放的磁头放大器使用;由于产品的高增益、低噪声及ALC外部可调的特性&…...
04-微服务02
我们将黑马商城拆分为5个微服务: 用户服务 商品服务 购物车服务 交易服务 支付服务 由于每个微服务都有不同的地址或端口,相信大家在与前端联调的时候发现了一些问题: 请求不同数据时要访问不同的入口,需要维护多个入口地址…...
Java中的this关键字详解:深入理解与应用
目录 一、this关键字的基本概念 二、this指代当前对象 示例: 三、this区分成员变量与方法参数 示例: 四、使用this()调用构造方法 示例: 五、使用this传递当前对象 示例: 六、this的其他注意事项输出结果: …...
2、C#基于.net framework的应用开发实战编程 - 设计(二、四) - 编程手把手系列文章...
二、设计; 二.四、制定设计规范; 编码规范在软件编程里起到了非常重要的作用,主要是让代码更加的规范化,更加的简洁,更加的漂亮,更加的能够面向对象显示。 以前那个系列就有发布C#的编码规范的文…...
设置首选网络类型以及调用Android框架层的隐藏API
在Android SDK中提供的framework.jar是阉割版本的,比如有些类标记为hide,这些类不会被打包到这个jar中,而有些只是类中的某个方法或或属性被标记为hide,则这些类或属性会被打包到framework.jar,但是我们无法调用&#…...
“Gold-YOLO:基于聚合与分发机制的高效目标检测新范式”
🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年12月26日8点00分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文源地址(有视频…...
神经网络-AlexNet
AlexNet是在2012年的ImageNet竞赛后,整理发表的文章,也是对CNN网络的衍生。 网络结构 AlexNet网络结构如下图所示,网络分为了上下两部分,对应两个不同的GPU训练,可以更好的利用GPU算力。只有在特殊的网络层后&#x…...
Hutool 发送 HTTP 请求的几种常见写法
最简单的 GET 请求: String result HttpUtil.get("https://www.baidu.com");带参数的 GET 请求: // 方法1: 直接拼接URL参数 String result HttpUtil.get("https://www.baidu.com?name张三&age18");// 方法2: 使用 HashMap…...
【Linux】进度条
本文中,我们来写一个进度条。 本文大纲: 写一个命令行版的进度条。 1.回车换行 2.缓冲区问题(本文不深究) 2.1测试代码 3.写一个什么样的进度条? version1 version2 回车换行 这俩不是一个概念&…...
【zookeeper核心源码解析】第四课:客户端与服务端读写的io核心流程
系列文章目录 【zookeeper核心源码解析】第一课:zk启动类核心流程序列图 【zookeeper核心源码解析】第二课:俯瞰QuorumPeer启动核心流程,实现选举关键流程 【zookeeper核心源码解析】第三课:leader与follower何时开始同步&#…...
强化学习蘑菇书笔记
绪论 强化学习就是一个智能体在一个不确定的环境中最大化它的奖励。智能体在一个环境中获取某个状态后,做一个动作,也称为决策,在环境中执行这个决策以后,会有一个奖励。尽可能多地获得更多的奖励。 强化学习概述 强化学习与监…...
《机器学习》——线性回归模型
文章目录 线性回归模型简介一元线性回归模型多元线性回归模型误差项分析一元线性模型实例完整代码 多元线性模型实例完整代码 线性回归模型简介 线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。 相关关系&…...
Linux(Centos 7.6)网卡信息没有了问题处理
1.问题现象 虚拟机打开后,使用ifconfig查看IP信息,虚拟机默认的网卡名称是ens33,ifconfig没有看到相关问题,远程连接工具Xshell也不能正常访问该虚拟机。 [rootnode1 ~]# ifconfig lo: flags73<UP,LOOPBACK,RUNNING> mtu…...
WEB攻防-通用漏洞-文件上传-js验证-MIME验证-user.ini-语言特征
目录 定义 1.前端验证 2.MIME验证 3.htaccess文件和.user. ini 4.对内容进行了过滤,做了内容检测 5.[ ]符号过滤 6.内容检测php [] {} ; 7.()也被过滤了 8.反引号也被过滤 9.文件头检测 定义 文件上传漏洞是指攻击者上传了一个可执行文件(如木马…...
mybatis-plus代码生成器
<!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><!--mybatis-plus-generator 生成器--><depende…...
12.24-12.28Mysql锁阅读笔记
1.Mysql的锁有哪些种类 全局锁, 通过flush tables with read lock 应用场景是全局备份,备份的时候如果有两个表,备份 先备份了用户表,然后用户了商品,再备份商品表 那么商品表库存减少了,然而用户表的育儿…...
支持最新 mysql9的workbench8.0.39 中文汉化教程来了
之前在 B 站上发布了 mysql8 workbench 汉化教程,一年多来帮助很多初学者解决了不熟悉英文的烦恼。 汉化视频可以访问: 2024最新版mysql8.0.39中文版mysql workbench汉化 中文升级 旧版汉化报错解决_哔哩哔哩_bilibili MySql Workbench汉化_哔哩哔哩_…...
golang连接jenkins构建build
1.安装jenkins依赖 go get github.com/bndr/gojenkins2.代码 import ("context""file/utils/logs""github.com/bndr/gojenkins""github.com/gin-gonic/gin""net/http""time" )// 接收单个静态文件上线参数 type…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
