【Mysql】哪些sql无法使用到索引

目录

[1.使用 OR 连接多个条件:](#1.使用 OR 连接多个条件:)

[2.使用 LIKE 通配符 % 作为前缀:](#2.使用 LIKE 通配符 % 作为前缀:)

[3.使用 BETWEEN 范围查询:](#3.使用 BETWEEN 范围查询:)

[4.使用 != 或 <> 操作符:](#4.使用 != 或 <> 操作符:)

[5.使用 DISTINCT 关键字:](#5.使用 DISTINCT 关键字:)

[6.使用 FUNCTION() 或 EXPRESSION 包含列:](#6.使用 FUNCTION() 或 EXPRESSION 包含列:)

[7.使用 JOIN 连接多个表:](#7.使用 JOIN 连接多个表:)

8.使用NULL值

9.使用函数

10.索引列参与表达式计算:

11.全表扫描优化选择:


在MySQL中,索引是提高查询效率的重要工具。然而,并非所有的SQL语句都能利用到索引。以下是一些无法使用索引的SQL情况:

1.使用 OR 连接多个条件:


sql 复制代码
SELECT * FROM table_name WHERE column1 = 'value1' OR column2 = 'value2';

解决方法:将 OR 替换为 UNION,或者将查询分成两个查询,然后在应用程序中合并结果。

sql 复制代码
SELECT * FROM table_name WHERE column1 = 'value1'
UNION
SELECT * FROM table_name WHERE column2 = 'value2';

2.使用 LIKE 通配符 % 作为前缀:


sql 复制代码
SELECT * FROM table_name WHERE column LIKE '%value%';

解决方法:尽量避免使用 % 作为前缀,或者使用全文索引(FULLTEXT)代替。

3.使用 BETWEEN 范围查询:


sql 复制代码
SELECT * FROM table_name WHERE column BETWEEN 'value1' AND 'value2';

解决方法:使用 >=<= 替换 BETWEEN

sql 复制代码
SELECT * FROM table_name WHERE column >= 'value1' AND column <= 'value2';

4.使用 !=<> 操作符:


sql 复制代码
SELECT * FROM table_name WHERE column != 'value';

解决方法:使用 != 替换为 NOT INNOT EXISTS

sql 复制代码
SELECT * FROM table_name WHERE column NOT IN ('value');

5.使用 DISTINCT 关键字:


sql 复制代码
SELECT DISTINCT column FROM table_name;

解决方法:使用 GROUP BY 替换 DISTINCT

sql 复制代码
SELECT column FROM table_name GROUP BY column;

6.使用 FUNCTION()EXPRESSION 包含列:


sql 复制代码
SELECT * FROM table_name WHERE LENGTH(column) > 5;

解决方法:将函数或表达式移出查询条件,并将其存储在一个变量中。

sql 复制代码
SELECT * FROM table_name WHERE column > 'value';

7.使用 JOIN 连接多个表:


sql 复制代码
SELECT * FROM table1 JOIN table2 ON table1.column = table2.column;

解决方法:在 JOIN 子句中使用 USING 关键字,或者在 ON 子句中使用 AND 连接多个条件。

sql 复制代码
SELECT * FROM table1 JOIN table2 USING (column);

或者:

sql 复制代码
SELECT * FROM table1 JOIN table2 ON table1.column = table2.column AND table1.column2 = table2.column2;

8.使用NULL值


当SQL语句中使用了NULL值作为查询条件时,索引也无法被应用。这是因为索引无法用于查找缺失的值。例如,下面的SQL语句使用了NULL值作为查询条件,这将导致MySQL无法使用索引进行查询。

sql 复制代码
SELECT * FROM customers WHERE name IS NULL;

9.使用函数


当SQL语句中使用函数时,索引将无法被应用。例如,下面的SQL语句使用了函数`UPPER`,'LOWER',这将导致MySQL无法使用索引进行查询。

sql 复制代码
SELECT * FROM customers WHERE UPPER(name) = 'JOHN';

SELECT * FROM table WHERE LOWER(column) = 'value';

10.索引列参与表达式计算:


sql 复制代码
SELECT * FROM table WHERE column + 10 = value;

11.全表扫描优化选择:


如果MySQL的优化器判断全表扫描比使用索引更快(例如,当表的数据量非常小或者需要返回大部分数据时),它可能会选择不使用索引。

请注意,这些情况并不绝对,实际是否使用索引还取决于具体的表结构、数据分布、查询条件以及MySQL的优化策略。在编写SQL查询时,应尽量遵循最佳实践并根据实际情况调整查询和索引设计。

相关推荐
学编程的小程43 分钟前
从“单模冲锋”到“多模共生”——2026 国产时序数据库新物种进化图谱
数据库·时序数据库
卓怡学长43 分钟前
m111基于MVC的舞蹈网站的设计与实现
java·前端·数据库·spring boot·spring·mvc
存在的五月雨1 小时前
Redis的一些使用
java·数据库·redis
小冷coding8 小时前
【MySQL】MySQL 插入一条数据的完整流程(InnoDB 引擎)
数据库·mysql
鲨莎分不晴9 小时前
Redis 基本指令与命令详解
数据库·redis·缓存
专注echarts研发20年9 小时前
工业级 Qt 业务窗体标杆实现・ResearchForm 类深度解析
数据库·qt·系统架构
周杰伦的稻香11 小时前
MySQL中常见的慢查询与优化
android·数据库·mysql
冉冰学姐11 小时前
SSM学生社团管理系统jcjyw(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·学生社团管理系统·多角色管理
nvd1112 小时前
深入分析:Pytest异步测试中的数据库会话事件循环问题
数据库·pytest
appearappear12 小时前
如何安全批量更新数据库某个字段
数据库