0

0

mysql查询优化时合理选择索引与存储引擎

P粉602998670

P粉602998670

发布时间:2026-01-13 04:59:20

|

581人浏览过

|

来源于php中文网

原创

未加索引导致全表扫描,I/O与CPU消耗剧增;重复值高字段索引可能被优化器弃用;EXPLAIN中key为NULL、rows接近总行数即为全扫;联合索引需遵循最左前缀原则;索引字段避免函数操作。

mysql查询优化时合理选择索引与存储引擎

为什么 WHERE 条件字段没加索引,查询就变慢?

MySQL 在执行 SELECT 时,若 WHERE 中的字段未被索引覆盖,引擎会触发全表扫描(type: ALL),数据量越大,I/O 和 CPU 消耗越明显。不是所有字段都适合建索引——重复值高的字段(如 status 只有 '0'/'1')走索引反而可能被优化器放弃,改用全表扫描。

  • EXPLAIN SELECT ...keyrows 字段:若 keyNULL,说明没走索引;rows 接近表总行数,大概率是全扫
  • 联合索引要注意最左前缀原则:INDEX (a, b, c) 能加速 WHERE a=1WHERE a=1 AND b=2,但对 WHERE b=2 无效
  • 避免在索引字段上使用函数或表达式:WHERE YEAR(create_time) = 2024 无法命中 create_time 索引,应改写为 WHERE create_time >= '2024-01-01' AND create_time

InnoDBMyISAM 在查询优化中怎么选?

绝大多数 OLTP 场景下,InnoDB 是唯一合理选择。它支持行级锁、事务、外键和崩溃恢复,而 MyISAM 的表级锁在并发更新时会严重阻塞查询,且无事务保障。即使你只读不写,MyISAM 的缓存机制(仅缓存索引,数据靠 OS 文件缓存)也远不如 InnoDBbuffer_pool 稳定可控。

  • InnoDB 的主键即聚簇索引,主键设计直接影响查询性能:尽量用自增整型,避免用 UUID 或字符串作主键(导致页分裂、B+ 树深度增加)
  • MyISAMCOUNT(*) 很快,因为它直接读元数据;但 InnoDB 需要实时统计,带 WHERECOUNT 两者都得走索引或扫描,别迷信“MyISAM 更快”
  • 如果真有超大只读历史表(如日志归档),可考虑 ARCHIVE 引擎,但它不支持索引,只适合按主键查单条或全量导出

哪些索引操作实际会拖慢查询?

索引不是越多越好。每多一个索引,INSERT/UPDATE/DELETE 就得多维护一棵 B+ 树,同时占用更多磁盘和内存。更隐蔽的问题是:优化器可能因索引过多而选错执行计划。

  • 重复索引浪费资源:INDEX (a)INDEX (a, b) 共存时,前者基本无用
  • 冗余索引干扰优化器:比如已有 INDEX (user_id, status, created_at),再加 INDEX (user_id, status) 不仅冗余,还可能让优化器误判索引选择成本
  • ORDER BYGROUP BY 字段若不在索引覆盖范围内,会导致 Using filesortUsing temporary,这两项出现在 EXPLAINExtra 列里,就是性能瓶颈信号
EXPLAIN SELECT user_id, COUNT(*) 
FROM orders 
WHERE status = 1 
GROUP BY user_id 
ORDER BY COUNT(*) DESC;

上面这个查询,如果只有 INDEX (status),就会触发 Using temporary; Using filesort;加上 INDEX (status, user_id) 后,GROUP BYORDER BY 都能利用索引有序性,消除临时表和排序。

迅易年度企业管理系统开源完整版
迅易年度企业管理系统开源完整版

系统功能强大、操作便捷并具有高度延续开发的内容与知识管理系统,并可集合系统强大的新闻、产品、下载、人才、留言、搜索引擎优化、等功能模块,为企业部门提供一个简单、易用、开放、可扩展的企业信息门户平台或电子商务运行平台。开发人员为脆弱页面专门设计了防刷新系统,自动阻止恶意访问和攻击;安全检查应用于每一处代码中,每个提交到系统查询语句中的变量都经过过滤,可自动屏蔽恶意攻击代码,从而全面防止SQL注入攻击

下载

如何验证索引是否真正生效?

别只看 EXPLAIN 显示用了哪个索引,要结合真实执行时间、扫描行数、以及 SHOW PROFILEperformance_schema 查看 I/O 和 CPU 消耗。有时优化器“选对了索引”,但因统计信息过期或数据倾斜,实际性能仍差。

  • 更新统计信息:ANALYZE TABLE orders;,尤其在大批量导入或删除后
  • 强制指定索引(仅调试用):SELECT * FROM orders USE INDEX (idx_user_status) WHERE user_id = 123;,对比执行时间变化
  • 注意隐式类型转换:比如 user_idINT,但查询写成 WHERE user_id = '123',可能导致索引失效(字符串与数字比较时,MySQL 可能转列而非参数)

索引和存储引擎的选择,本质是权衡读写比例、一致性要求和数据规模。很多线上慢查,问题不在 SQL 写得不好,而在建表时没想清楚主键怎么设、用什么引擎、哪些查询路径必须走索引——这些决策一旦固化,后期改造成本远高于初期设计。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

676

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

346

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1094

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

675

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

571

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

414

2024.04.29

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

10

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.7万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 787人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号