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

news/2024/11/24 8:54:34/

目录

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

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

3.使用 BETWEEN 范围查询:

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

5.使用 DISTINCT 关键字:

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

7.使用 JOIN 连接多个表:

8.使用NULL值

 9.使用函数

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

 11.全表扫描优化选择:


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

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


SELECT * FROM table_name WHERE column1 = 'value1' OR column2 = 'value2';

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

SELECT * FROM table_name WHERE column1 = 'value1'
UNION
SELECT * FROM table_name WHERE column2 = 'value2';

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


SELECT * FROM table_name WHERE column LIKE '%value%';

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

3.使用 BETWEEN 范围查询:


SELECT * FROM table_name WHERE column BETWEEN 'value1' AND 'value2';

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

SELECT * FROM table_name WHERE column >= 'value1' AND column <= 'value2';

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


SELECT * FROM table_name WHERE column != 'value';

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

SELECT * FROM table_name WHERE column NOT IN ('value');

5.使用 DISTINCT 关键字:


SELECT DISTINCT column FROM table_name;

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

SELECT column FROM table_name GROUP BY column;

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


SELECT * FROM table_name WHERE LENGTH(column) > 5;

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

SELECT * FROM table_name WHERE column > 'value';

7.使用 JOIN 连接多个表:


SELECT * FROM table1 JOIN table2 ON table1.column = table2.column;

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

SELECT * FROM table1 JOIN table2 USING (column);

或者:

SELECT * FROM table1 JOIN table2 ON table1.column = table2.column AND table1.column2 = table2.column2;

8.使用NULL值


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

SELECT * FROM customers WHERE name IS NULL;

 9.使用函数


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

SELECT * FROM customers WHERE UPPER(name) = 'JOHN';SELECT * FROM table WHERE LOWER(column) = 'value';

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


SELECT * FROM table WHERE column + 10 = value;

 11.全表扫描优化选择:


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

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


http://www.ppmy.cn/news/1278830.html

相关文章

什么是数据仪表板?数据可视化仪表盘怎么制作?

在数据经济时代&#xff0c;分析数据是每个企业做出最佳决策的关键。但是&#xff0c;手动分析和解释大量数据是不可行的。数据可视化对于分析数据中存在的各种有价值信息至关重要&#xff0c;包括可见趋势和隐藏趋势等。仪表盘显示可视化趋势和信息&#xff0c;例如 KPI、趋势…

rich.sql

1、 CURRENT_TIMESTAMP 2、like concat (%,#{},%) 3、var num 2.446242342; num num.toFixed(2); // 输出结果为 2.45 4、left (case when hour(create_time) < 7 then DATE_ADD(create_time,INTERVAL -1 DAY) else create_time end ,10) as date 5、service mysqld …

如何在Windows上搭建WebDAV服务并通过内网穿透实现公网访问

文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav&#xff0c;并且结合cpolar的内网穿透工具实现在公网访…

俄罗斯联邦税务局遭乌克兰入侵,数据库和副本被清空,政府数据安全不容忽视

俄罗斯联邦税务局遭乌克兰入侵&#xff0c;数据库和副本被清空&#xff0c;政府数据安全不容忽视 据相关报道&#xff0c;2023年12月12日&#xff0c;乌克兰国防情报局(GUR)称其成功入侵了俄罗斯联邦税务局&#xff08;FNS&#xff09;系统&#xff0c;并清除了该机构的数据库和…

嵌入式中断理解

一、概念 中断&#xff1a; 在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行。 中断优先级&#x…

Java学习系列(九)

1.枚举&#xff08;enum&#xff09; Java 枚举是一个特殊的类&#xff0c;一般表示一组常量。 如&#xff1a;一年的 4 个季节&#xff0c;一年的 12 个月份&#xff0c;一个星期的 7 天&#xff0c;方向有东南西北等。 enum Color { RED, GREEN, BLUE; } 枚举类使用 en…

Spring接口返回的类型是json格式,里面字段对应base64格式的excel文件

使用场景&#xff1a;需要对前端导入的excel文件中的内容进行验证&#xff0c;如期中有验证失败的信息需要转成excel反馈给前端&#xff0c;用户下载查看信息&#xff0c;并且前端需要获取json返回的状态&#xff0c;给用户提示失败或者成功&#xff0c;所以需要导出json的同时…

Linux笔记本电脑投屏到电视,用网页浏览器就能投屏到电视!

Linux系统的电脑如果要投屏到安卓电视屏幕上&#xff0c;可以使用投屏工具AirDroid Cast的网页版和TV版一起实现。 首先&#xff0c;在Linux系统的电脑里用chrome浏览器或edge浏览器打开网址webcast.airdroid.com。这个网址就是AirDroid Cast的网页版。你可以看到中间白色框框的…