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…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...

VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...
Easy Excel
Easy Excel 一、依赖引入二、基本使用1. 定义实体类(导入/导出共用)2. 写 Excel3. 读 Excel 三、常用注解说明(完整列表)四、进阶:自定义转换器(Converter) 其它自定义转换器没生效 Easy Excel在…...