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

目录

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查询时,应尽量遵循最佳实践并根据实际情况调整查询和索引设计。

相关推荐

  1. Mysql哪些sql无法使用索引

    2023-12-22 20:24:03       32 阅读
  2. mysql如何分析sql是否成功使用索引

    2023-12-22 20:24:03       43 阅读
  3. MySQL索引哪些优缺点

    2023-12-22 20:24:03       34 阅读
  4. MySQL索引的管理索引使用原则以及SQL优化

    2023-12-22 20:24:03       31 阅读
  5. MysqlMySQL索引使用

    2023-12-22 20:24:03       5 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-22 20:24:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-22 20:24:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-22 20:24:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-22 20:24:03       20 阅读

热门阅读

  1. 掌握Jenknis基础概念

    2023-12-22 20:24:03       34 阅读
  2. 如何查看计算机(笔记本)设备的SN

    2023-12-22 20:24:03       63 阅读
  3. C语言指针基础题(三)

    2023-12-22 20:24:03       48 阅读
  4. elasticsearch8.5版本集成springboot高版本3.0.0开发

    2023-12-22 20:24:03       32 阅读
  5. 列表的上移动和下移动实现

    2023-12-22 20:24:03       39 阅读
  6. GSON 泛型对象反序列化解决方案

    2023-12-22 20:24:03       41 阅读
  7. k8s中Chart模板流程控制if_with_range和变量

    2023-12-22 20:24:03       40 阅读
  8. Watchdogs

    Watchdogs

    2023-12-22 20:24:03      35 阅读
  9. 基于K-means和形态学算法的叶子病虫害检测

    2023-12-22 20:24:03       40 阅读