MySQL索引失效

devtools/2025/2/27 14:42:40/

MySQL索引失效会导致查询性能下降,常见原因及解决方案如下:

一、使用OR条件

  • 原因:当OR条件中有一个列没有索引时,索引可能失效

  • 解决方法:确保OR条件中的所有列都有索引,或使用UNION替代OR

-- 不推荐
SELECT * FROM table WHERE col1 = 'value' OR col2 = 'value';
​
-- 推荐
SELECT * FROM table WHERE col1 = 'value'
UNION
SELECT * FROM table WHERE col2 = 'value';

(注:UNION 操作符返回两个查询的结果集的并集,去除重复记录。)

二、使用LIKE以通配符开头

  • 原因:LIKE'%value'或LIKE'%value%'会导致索引失效

  • 解决方案:尽量避免以通配符开头,或使用全文索引

-- 不推荐
SELECT * FROM table WHERE col LIKE '%value';
​
-- 推荐
SELECT * FROM table WHERE col LIKE 'value%';

三、对索引列使用函数或表达式

  • 原因:对索引列使用函数表达式(如WHERE YEAR(col)=2023)会导致索引失效

  • 解决方案:避免在索引列上使用函数或表达式

-- 不推荐
SELECT * FROM table WHERE YEAR(col) = 2023;
​
-- 推荐
SELECT * FROM table WHERE col >= '2023-01-01' AND col < '2024-01-01';

四、数据类型不匹配

  • 原因:查询条件与列数据类型不匹配(如字符串列与数字比较)会导致索引无效

  • 解决方案:确保查询条件与列数据类型一致

-- 不推荐
SELECT * FROM table WHERE col = 123;  -- col 是字符串类型
​
-- 推荐
SELECT * FROM table WHERE col = '123';

五、使用NOT或!=

  • 原因:NOT或!=可能导致索引失效

  • 解决方案:尽量避免使用NOT或!=,或考虑其他查询方式

-- 不推荐
SELECT * FROM table WHERE col != 'value';
​
-- 推荐
SELECT * FROM table WHERE col = 'value1' OR col = 'value2';

六、复合索引未遵循最左前缀原则

  • 原因:复合索引未按最左前缀原则使用时,索引可能失效

  • 解决方案:确保查询条件从符合索引的最左列开始

-- 复合索引 (col1, col2)
-- 不推荐
SELECT * FROM table WHERE col2 = 'value';
​
-- 推荐
SELECT * FROM table WHERE col1 = 'value' AND col2 = 'value';

七、数据分布不均

  • 原因:当某列数据分布不均时,MySQL可能选择全表扫描而非索引

  • 解决方案:使用FORCE INDEX强制使用索引,或优化查询

-- 强制使用索引
SELECT * FROM table FORCE INDEX (index_name) WHERE col = 'value';

八、索引选择性低

  • 原因:索引选择性低(如布尔列)时,MySQL可能不使用索引

  • 解决方案:考虑删除低选择性的索引,或结合其他列创建复合索引

-- 低选择性索引
CREATE INDEX idx ON table (low_selectivity_col);
​
-- 高选择性复合索引
CREATE INDEX idx ON table (low_selectivity_col, high_selectivity_col);

九、查询返回大量数据

  • 原因:当查询返回大量数据时,MySQL可能选择全表扫描

  • 解决方案:优化查询条件,减少返回数据量,或使用分页

-- 不推荐
SELECT * FROM table WHERE col > 'value';
​
-- 推荐
SELECT * FROM table WHERE col > 'value' LIMIT 100;

十、索引损坏

  • 原因:索引损坏会导致索引失效

  • 解决方案:使用REPAIR TABLE或OPTIMIZE TABLE修复索引

REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;

总结

索引失效的原因多样,常见问题包括 OR 条件、LIKE 通配符、函数使用、数据类型不匹配等。通过优化查询、调整索引设计,可以有效避免索引失效,提升查询性能。


http://www.ppmy.cn/devtools/163091.html

相关文章

基于Springboot的小说网站【附源码】

基于Springboot的小说网站 效果如下&#xff1a; 系统主页面 书库信息页面 书籍详情页面 推荐信息页面 小说推荐页面 书库信息页面 小说排行榜页面 系统管理页面 研究背景 随着互联网技术的快速发展&#xff0c;网络文学逐渐成为一种新兴的文学形式&#xff0c;吸引了大量读…

docker 部署 rocketmq

RocketMQ 是一个分布式消息中间件&#xff0c;使用 Docker 可以方便地进行部署。 拉取 RocketMQ 镜像 首先&#xff0c;拉取 RocketMQ 的官方镜像&#xff1a; docker pull apache/rocketmq:latest部署 NameServer 创建数据卷目录&#xff1a; mkdir -p /usr/local/rocket…

Canvas在视频应用中的技术解析

Canvas 在视频方向的应用非常广泛&#xff0c;结合其动态绘图和实时渲染能力&#xff0c;可以实现许多与视频相关的交互、处理和分析功能。以下是几个主要应用方向及具体示例&#xff1a; 1. 视频播放与控制 自定义视频播放器 使用 Canvas 绘制独特的播放器 UI&#xff08;如进…

序列化是什么?常见的序列化方式有哪些?什么时候我们会用到序列化?

序列化&#xff08;Serialization&#xff09;是指将对象的状态信息转换为可以存储或传输的形式&#xff08;如字节序列、XML 文档、JSON 字符串等&#xff09;的过程。反序列化则是序列化的逆过程&#xff0c;它将存储或接收到的字节序列、XML 文档、JSON 字符串等转换回对象的…

Python爬虫系统搭建教程,从0开始搭建爬虫系统(附安装包)

文章目录 前言一、Python环境搭建1.Python安装2.选择Python开发环境3. 安装必要库 二、基础爬虫构建1. 发送请求获取网页2. 解析网页提取数据 三、使用 Scrapy 框架搭建系统1. 创建 Scrapy 项目2. 生成爬虫3. 编写爬虫代码4. 运行爬虫 四、应对反爬虫机制1. 常见反爬虫手段2. 解…

FPGA开发要学些什么?如何快速入门?

随着FPGA行业的不断发展&#xff0c;政策的加持和投入的研发&#xff0c;近两年FPGA行业的薪资也是水涨船高&#xff0c;一些人转行后拿到了薪资30W&#xff0c;甚至有一些能力强的人可以拿到60W&#xff0c;看到这里想必不少人表示很心动&#xff0c;但又不知道怎么转&#xf…

jdk21下载、安装(Windows、Linux、macOS)

Windows 系统 1. 下载安装 访问 Oracle 官方 JDK 下载页面 或 OpenJDK 下载页面&#xff0c;根据自己的系统选择合适的 Windows 版本进行下载&#xff08;通常选择 .msi 安装包&#xff09;。 2. 配置环境变量 右键点击 “此电脑”&#xff0c;选择 “属性”。 在左侧导航栏…

【DeepSeek系列】05 DeepSeek核心算法改进点总结

文章目录 一、DeepSeek概要二、4个重要改进点2.1 多头潜在注意力2.2 混合专家模型MoE2.3 多Token预测3.4 GRPO强化学习策略 三、2个重要思考3.1 大规模强化学习3.2 蒸馏方法&#xff1a;小模型也可以很强大 一、DeepSeek概要 2024年&#xff5e;2025年初&#xff0c;DeepSeek …