Mysql什么情况下不会命中索引

 更新时间:2025年04月02日 09:56:12   作者:愿你天黑有灯下雨有伞  
在某些情况下,即使存在索引,查询也可能不会使用到索引,从而导致查询效率降低,下面就来介绍一下Mysql什么情况下不会命中索引,感兴趣的可以了解一下

1. 使用OR条件

-- 假设name列有索引,age列没有索引
SELECT * FROM employees WHERE name = 'John' OR age > 30;

在这个查询中,由于age列没有索引,优化器可能选择全表扫描而不是使用name列上的索引。

2. 隐式类型转换

-- 假设id是整数类型,但查询中用字符串比较
SELECT * FROM users WHERE id = '123';

尽管id列上有索引,但由于隐式类型转换,MySQL可能无法使用该索引。

3. 模糊查询的前导通配符

-- 假设username列有索引
SELECT * FROM users WHERE username LIKE '%john';

因为模式以%开头,所以索引不能被用于加速查询。

4. 对索引列进行函数操作

-- 假设created_at列有索引
SELECT * FROM orders WHERE YEAR(created_at) = 2020;

created_at应用了YEAR()函数,导致索引失效。

5. 复合索引未遵循最左前缀原则

-- 创建一个复合索引 (first_name, last_name)
CREATE INDEX idx_name ON employees(first_name, last_name);
-- 查询只用了last_name
SELECT * FROM employees WHERE last_name = 'Doe';

由于查询条件没有从复合索引的第一个字段开始,因此不会使用这个索引。

6. 索引选择性低

-- 假设status列有很多重复值(如active/inactive),并有索引
SELECT * FROM accounts WHERE status = 'active';

如果status列的选择性很低(即大量记录具有相同的值),MySQL可能会选择全表扫描而非索引扫描。

7. 索引长度超出限制

-- 假设text_column是一个非常长的VARCHAR列,并尝试创建一个过长的索引
CREATE INDEX idx_long_text ON articles(text_column(255));

如果text_column的长度超过了InnoDB索引的最大长度,索引创建将会失败。

8. 表统计信息过期

-- 如果长时间没有分析表,统计信息可能不准确
ANALYZE TABLE employees;

定期运行ANALYZE TABLE可以帮助优化器做出更好的决策。

9. 索引列参与了NULL检查

-- 假设nullable_column允许NULL值,并有索引
SELECT * FROM items WHERE nullable_column IS NULL;

虽然B树索引可以处理IS NULL,但如果设计不当,这仍可能导致索引未被使用。

10. 查询结果集过大

-- 即使有索引,如果查询返回的结果集非常大
SELECT * FROM logs WHERE log_date BETWEEN '2020-01-01' AND '2020-12-31';

在这种情况下,全表扫描可能是更高效的选择。

以上例子展示了不同的场景下如何影响索引的使用。为了确保索引能有效工作,需要仔细考虑这些因素,并通过EXPLAIN命令验证查询计划

到此这篇关于Mysql什么情况下不会命中索引的文章就介绍到这了,更多相关 Mysql不会命中索引内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL大库搭建主从的一种思路分享

    MySQL大库搭建主从的一种思路分享

    这篇文章主要介绍了MySQL大库搭建主从的一种思路分享,帮助大家更好的理解和学习使用MySQL数据库,感兴趣的朋友可以了解下
    2021-03-03
  • MySQL AUTO_INCREMENT 主键自增长的实现

    MySQL AUTO_INCREMENT 主键自增长的实现

    本文主要介绍了MySQL AUTO_INCREMENT 主键自增长的实现,每增加一条记录,主键会自动以相同的步长进行增长,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • 详解MySQL 5.7 MGR单主确定主节点方法

    详解MySQL 5.7 MGR单主确定主节点方法

    这篇文章主要介绍了详解MySQL 5.7 MGR单主确定主节点方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • MySQL8 排名窗口函数实战

    MySQL8 排名窗口函数实战

    本文阐明SQL三个排名函数处理并列名次时的区别,包括RANK()跳跃,DENSE_RANK()连续,ROW_NUMBER()分配唯一序号,下面就来详细的介绍一下,感兴趣的可以了解一下
    2026-02-02
  • 关于避免MySQL替换逻辑SQL的坑爹操作详解

    关于避免MySQL替换逻辑SQL的坑爹操作详解

    这篇文章主要给大家介绍了关于避免MySQL替换逻辑SQL的坑爹操作的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • mysql数据库语句优化过程

    mysql数据库语句优化过程

    这篇文章主要介绍了mysql数据库语句优化过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-07-07
  • MySQL 聚簇索引、非聚簇索引与回表详解

    MySQL 聚簇索引、非聚簇索引与回表详解

    本文我们从数据库物理存储的底层逻辑出发,系统拆解了聚簇索引与非聚簇索引的核心概念、存储结构、查询流程,以及"回表"操作的本质,感兴趣的朋友跟随小编一起看看吧
    2026-02-02
  • SQL Server COALESCE函数详解及实例

    SQL Server COALESCE函数详解及实例

    这篇文章主要介绍了SQL Server COALESCE函数详解及实例的相关资料,COALESCE函数比ISNULL更加强大,这个函数的确非常有用,需要的朋友可以参考下
    2016-12-12
  • MySQL 5.7.13 源码编译安装配置方法图文教程

    MySQL 5.7.13 源码编译安装配置方法图文教程

    这篇文章主要介绍了MySQL 5.7.13 源码编译安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • 设置MySQL中的数据类型来优化运行速度的实例

    设置MySQL中的数据类型来优化运行速度的实例

    这篇文章主要介绍了设置MySQL中索引的数据类型来优化运行速度的实例,主要是适当使用短字节的数据类型来处理短索引,需要的朋友可以参考下
    2015-05-05

最新评论