【Mysql】哪些sql无法使用到索引
2023-12-22 20:41:55
目录
6.使用?FUNCTION()?或?EXPRESSION?包含列:
在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查询时,应尽量遵循最佳实践并根据实际情况调整查询和索引设计。
文章来源:https://blog.csdn.net/q8688/article/details/135157597
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!