MySQL索引失效

news/2025/2/26 8:23:09

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.niftyadmin.cn/n/5868377.html

相关文章

进程状态(R|S|D|t|T|X|Z)、僵尸进程及孤儿进程

文章目录 一.进程状态进程排队状态&#xff1a;运行、阻塞、挂起 二.Linux下的进程状态R 运行状态&#xff08;running&#xff09;S 睡眠状态&#xff08;sleeping)D 磁盘休眠状态&#xff08;Disk sleep&#xff09;t 停止、暂停状态(tracing stopped)T 停止、暂停状态(stopp…

【UCB CS 61B SP24】Lecture 14 - Data Structures 1: Disjoint Sets学习笔记

本文内容为数据结构并查集&#xff08;DSU&#xff09;的介绍与实现&#xff0c;详细讲解了并查集这一数据结构所能实现的各种操作&#xff0c;以及如何通过路径压缩与按秩合并大幅优化并查集的效率。 1. 并查集 1.1 介绍及其基础操作 并查集&#xff08;Disjoint Set Union…

冯诺依曼体系结构 ──── linux第8课

目录 冯诺依曼体系结构 关于冯诺依曼&#xff0c;必须强调几点&#xff1a; 冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系 输入单元&#xff1a;包括键盘, 鼠标&#xff0c;网卡,扫…

C#语音识别与播报开发指南

C# 语音识别离线开发推荐库 以下是一些适用于 C# 离线语音识别的库&#xff0c;支持本地处理&#xff0c;无需网络连接&#xff1a; 1. System.Speech.Recognition (Windows) 简介&#xff1a;.NET Framework 自带的库&#xff0c;适合简单的离线命令词识别。适用场景&#x…

Python--内置函数与推导式(上)

1. 匿名函数 Lambda表达式基础 语法&#xff1a;lambda 参数: 表达式​ 特点&#xff1a; 没有函数名&#xff0c;适合简单逻辑函数体只能是单行表达式自动返回表达式结果 # 示例1&#xff1a;加法 add lambda a, b: a b print(add(3, 5)) # 输出 8# 示例2&#xff1a;字…

selenium如何实现,开启浏览器的开发者工具模式,并且开启 toggle移动设备模拟模式

核心实现代码 pythonCopy Code from selenium import webdriver from selenium.webdriver.chrome.options import Options def enable_devtools_with_toggle(): options Options() # 强制开启开发者工具 options.add_argument("--auto-open-devtools-for-tabs&quo…

【图像处理 --- Sobel 边缘检测的详解】

Sobel 边缘检测的详解 目录 Sobel 边缘检测的详解1. 梯度计算2. 梯度大小3. 梯度方向4. 非极大值抑制5. 双阈值处理6. 在 MATLAB 中实现 Sobel 边缘检测7.运行结果展示8.关键参数解释9.实验与验证 Sobel 边缘检测是一种经典的图像处理算法&#xff0c;用于检测图像中的边缘。它…

《Linux命令行和shell脚本编程大全》第二章阅读笔记

二.走进shell 1.进入命令行 在图形化桌面出现之前&#xff0c;和 Unix 系统交互的唯一方式就是通过 shell 提供的文本命令行界面&#xff08;command line interface&#xff0c;CLI&#xff09;。CLI 只允许输入文本&#xff0c;而且只能显示文本和基本图形输出。由于此限制…