MySQL 中使用索引一定有效吗?如何排查索引效果?

news/2024/12/14 22:50:23/文章来源:https://www.cnblogs.com/eiffelzero/p/18607383

MySQL 中使用索引一定有效吗?如何排查索引效果?

虽然索引是提升 MySQL 查询性能的常见手段,但并不是所有情况下索引都会有效。索引的使用取决于查询条件、数据分布、索引设计等多个因素。如果索引未能有效使用,可能导致查询性能不如预期。


1. 索引未必一定有效的情况

以下是一些常见的导致 MySQL 不使用索引的情况:

(1)索引选择性差

  • 如果索引列的数据选择性较低(例如:某个列的值大部分相同),索引可能不会被使用。此时,MySQL 会选择全表扫描,而不是使用索引,因为全表扫描的成本可能比索引扫描更低。

  • 示例

    SELECT * FROM users WHERE gender = 'Male';
    

    如果 gender 列只有 'Male''Female' 两个值,索引选择性差,MySQL 可能选择全表扫描。

(2)范围查询

  • 使用了范围查询(如 BETWEEN><LIKE 等)时,索引会被部分使用,通常只能利用范围查询前的字段索引。

  • 示例

    SELECT * FROM users WHERE age > 30 AND name = 'Alice';
    

    在这种查询中,age > 30 是范围查询,MySQL 可能只使用 age 索引,忽略 name 索引。

(3)对索引列使用了函数或表达式

  • 在查询中对索引列使用了函数(如 YEAR(date_column))或进行表达式计算时,索引可能会失效,因为计算后值与存储的索引值不匹配。

  • 示例

    SELECT * FROM orders WHERE YEAR(order_date) = 2023;
    

    YEAR(order_date) 会导致索引失效,除非使用适当的索引,如索引覆盖完整的 order_date 列。

(4)隐式类型转换

  • 在查询中,如果传入的查询条件数据类型与索引列的数据类型不同,MySQL 可能会进行隐式类型转换,导致索引失效。

  • 示例

    SELECT * FROM users WHERE age = '25';
    

    如果 age 列是 INT 类型,而查询条件是字符串 '25',会导致类型不匹配,进而导致索引失效。

(5)使用 OR 连接条件

  • 在查询中使用 OR 时,如果 OR 连接的条件不能充分利用索引,MySQL 可能会选择全表扫描。

  • 示例

    SELECT * FROM users WHERE name = 'Alice' OR age = 30;
    

    如果 nameage 列分别有索引,MySQL 可能不能有效使用这两个索引,而是选择全表扫描。


2. 如何排查索引效果

要确保索引的有效使用,并排查可能的索引问题,可以使用以下方法:

(1)使用 EXPLAIN 命令分析查询计划

  • EXPLAIN 命令可以显示 MySQL 执行查询时选择的执行计划,帮助我们判断是否使用了索引。

  • 示例

    EXPLAIN SELECT * FROM users WHERE name = 'Alice' AND age = 30;
    

    EXPLAIN 的输出会显示是否使用了索引、使用了哪个索引、索引扫描的类型等信息。

    常见的 EXPLAIN 输出解释

    • key:显示使用的索引。
    • type:连接类型,ALL 表示全表扫描,range 表示范围扫描,ref 表示索引查找。
    • rows:MySQL 预计扫描的行数。

(2)使用 SHOW WARNINGS 排查索引失效原因

  • 如果查询没有使用索引,MySQL 会通过 SHOW WARNINGS 显示相关警告信息,指示索引未能使用的原因。

  • 示例

    SHOW WARNINGS;
    

(3)查看慢查询日志

  • 通过启用慢查询日志,可以查看哪些查询可能因为没有使用索引而执行缓慢。

  • 配置慢查询日志

    slow_query_log = 1
    slow_query_log_file = /path/to/slow-query.log
    long_query_time = 1
    

    慢查询日志记录了执行时间超过指定阈值的查询,帮助我们定位可能的索引问题。


3. 优化索引使用的建议

(1)优化查询条件

  • 确保查询条件字段与索引顺序匹配,尤其是在多列联合索引的情况下,遵循最左前缀原则。

(2)避免函数和类型转换

  • 尽量避免在查询条件中使用对索引列的函数或表达式。保持查询条件与索引列的数据类型一致。

(3)减少不必要的 OR 操作

  • 使用 IN 替代 OR,或者根据需要重写查询以避免导致索引失效的 OR 条件。

(4)增加覆盖索引

  • 对查询中常用的字段,设计覆盖索引,这样 MySQL 可以直接从索引中返回结果,避免回表操作。

4. 总结

索引的使用并非在所有情况下都有效。要确保索引能够提升查询性能,除了合理设计索引,还需要排查影响索引使用的因素,如范围查询、隐式类型转换、函数应用等。通过使用 EXPLAIN 分析查询执行计划,结合慢查询日志和 SHOW WARNINGS,可以帮助排查和优化索引效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/852709.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PolarCTF-Pwn(困难)WP

1、ret2libc 前期准备:int __fastcall main(int argc, const char **argv, const char **envp) {char s[112]; // [rsp+0h] [rbp-70h] BYREFsetvbuf(stdin, 0LL, 2, 0LL);setvbuf(stdout, 0LL, 2, 0LL);setvbuf(stderr, 0LL, 2, 0LL);gets(s);puts(s);return 0; }因为程序是动…

游戏产业加速鸿蒙化步伐:超1800款鸿蒙原生游戏已上架

2024年度中国游戏产业年会于12月12日至13日北京市首钢国际会展中心举办,华为终端云全球生态发展与销售部副总裁张思建受邀出席主论坛,并发表了主题演讲。同期,由华为游戏中心主办的鸿蒙游戏行业论坛也在北京石景山区举行,本次活动邀请了中国音像与数字出版协会常务副理事长…

最强分类器调优秘诀!AdaBoost让性能飙升!

本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。 各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。…

Toyota Programming Contest 2024#12(AtCoder Beginner Contest 384)题解

总体情况感觉这次在起飞。 20 分钟后就在罚坐。 A - aaaadaa 题目描述 给定一个长度为 \(N\) 的字符串 \(S\) ,由小写英文字母以及小写英文字母 \(c_1\) 和 \(c_2\) 组成。 查找将 \(S\) 中所有不属于 \(c_1\) 的字符替换为 \(c_2\) 后得到的字符串。 思路分析 直接模拟。代码…

解决2024.1以后新版本IDEA Lombok (@Data)等不生效的问题

做项目做着做着新模块用不了 lombok 真的要崩溃了,各种检查插件、配置,发现都无法恢复;乱试指定版本:终于可用了。。真的有崩溃感

DNS之公共DNS

阿里 AliDNS 阿里公共DNS是阿里巴巴集团推出的DNS递归解析系统,目标是成为国内互联网基础设施的组成部分,面向互联网用户提供“快速”、“稳定”、“智能”的免费DNS递归解析服务。 DNS 服务器 IP 地址: 首选:223.5.5.5 备选:223.6.6.6 阿里公共DNS114DNS 国内用户量巨大的…

NestJS 部署Apache

要将Nest.JS应用搭建在Apache服务器上,你需要了解Nest.JS是一个基于Node.js的框架,因此它本质上是一个后端服务,而Apache通常用作前端服务器或反向代理。以下是将Nest.JS应用与Apache服务器结合使用的步骤: 一、准备环境安装Node.js:确保在服务器上安装了Node.js。你可以从…

综合设计——多源异构数据采集与融合应用综合实践

这个项目属于哪个课程2024数据采集与融合技术实践 组名 从你的全世界爬过团队logo:项目简介 项目名称:博物识植项目logo:项目介绍:在探索自然奥秘的旅途中,我们常与动植物相伴而行,却无法准确识别它们,更难以深入了解他们的特征。为了更好地理解和欣赏自然界的多样性,…

maven docker-maven-plugin 发布docker 20241214

1、docker开启远程访问 端口 2375docker主机:192.168.177.128 vi /usr/lib/systemd/system/docker.service #修改ExecStart这行 ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 #重新加载配置文件 [root@localhost ~]# systemctl daemon-reload #重启服务 [root@lo…

10大关键技术解构:智能合同审查系统全景解析

前言 随着企业数字化转型的深入,合同管理在业务流程中的重要性愈加凸显。传统的人工审查合同方式不仅耗时耗力,还容易出现疏漏,尤其在复杂法律条款和跨部门协作的场景中,这一问题尤为明显。为了解决这一痛点,思通数科智能合同审查系统应运而生。基于人工智能和大数据分析的…