0

0

mysql的索引优化与数据库存储引擎选择

P粉602998670

P粉602998670

发布时间:2026-01-28 10:02:41

|

191人浏览过

|

来源于php中文网

原创

WHERE条件未走索引主因是索引失效:隐式类型转换、索引列用函数、联合索引缺失最左前缀、IS NULL在部分版本不走索引;InnoDB聚簇索引需回表,MyISAM索引存物理地址;MEMORY仅适用于临时数据;联合索引顺序应按查询中WHERE和ORDER BY字段组合确定。

mysql的索引优化与数据库存储引擎选择

为什么 WHERE 条件用了字段却没走索引?

常见现象是执行 EXPLAIN SELECT * FROM t WHERE status = 'active'; 显示 type=ALL,即全表扫描。根本原因往往不是没建索引,而是索引失效:

  • status 字段类型为 VARCHAR,但查询时写了 WHERE status = 1隐式类型转换
  • 在索引列上用了函数,比如 WHERE UPPER(name) = 'JOHN'
  • 联合索引 (a,b,c),只用 WHERE b = ?WHERE a = ? AND c = ?(缺少最左前缀)
  • 索引列允许 NULL,且查询条件是 IS NULL,某些 MySQL 版本下无法使用索引(尤其 MyISAM

验证方式:用 SHOW INDEX FROM t; 看索引结构,再用 EXPLAIN FORMAT=TRADITIONAL 查看实际是否命中。

InnoDBMyISAM 在索引设计上的关键差异

二者 B+ 树组织方式不同,直接影响你建什么索引、怎么写查询:

  • InnoDB 主键即聚簇索引,数据行直接存于主键 B+ 树的叶子节点;二级索引叶子存的是主键值,回表成本真实存在
  • MyISAM 所有索引都是非聚簇的,叶子节点存的是行物理地址(.MYD 文件偏移),没有“回表”概念,但不支持事务和行锁
  • 如果你频繁按 user_id 查询并需要返回大量字段,InnoDB 下把 user_id 设为主键或建覆盖索引(如 INDEX idx_uid_name_age (user_id, name, age))能避免回表
  • MyISAMCOUNT(*) 很快(内部维护行数),但 InnoDB 必须扫索引树——所以不要在大表上无条件用 SELECT COUNT(*)

什么时候该用 MEMORY 引擎?别只看“快”

MEMORY 表数据全在内存,SELECT 极快,但极易误用:

诚石C2C交易系统
诚石C2C交易系统

1. 页面全部经过SEO(搜索引擎优化)处理 2. 支持IE、FireFox等主流浏览器,在IE 和FireFox下显示相同的效果 3. 符合W3C国际网页标准,页面全部采用DIV+CSS布局 4. 采用SQL server数据库,所有数据库操作采用存储过程 5. 部分功能采用AJAX技术,良好的用户体验。 6. 后台集成在线HTML编辑软件FCKEditor,自定义美观的内容

下载
  • 只适合临时中间结果、缓存维度表(如城市字典)、或秒级生命周期的会话数据
  • 不支持 TEXT/BLOB 类型,也不支持外键和事务
  • 服务器重启后数据全丢——如果误把用户订单表设为 MEMORY,就是生产事故
  • 默认用哈希索引(HASH),只支持等值查询(=);范围查询(BETWEEN>)必须显式声明 USING BTREE
CREATE TABLE tmp_user_cache (
  id BIGINT PRIMARY KEY,
  name VARCHAR(64),
  updated_at DATETIME
) ENGINE=MEMORY
  DEFAULT CHARSET=utf8mb4
  AVG_ROW_LENGTH=128;

联合索引字段顺序到底怎么排?看查询模式,不是看字段重要性

错误认知:“把区分度高的字段放前面”。真正决定顺序的是 WHEREORDER BY 的组合模式:

  • 如果常查 WHERE category = ? AND status = ? ORDER BY created_at DESC,索引应为 (category, status, created_at),而非反过来
  • 如果还有 WHERE category = ? ORDER BY status ASC,那 (category, status) 就比单列 category 更有效
  • 注意 ORDER BY 方向一致性:(a ASC, b DESC) 在 MySQL 8.0+ 才支持,旧版本会忽略 b 的排序,降级为文件排序(Using filesort
  • 索引总长度别超限制:InnoDB 单索引前缀最大 3072 字节utf8mb4 下约 768 个字符),超了会截断,导致后缀字段失效

最常被忽略的一点:索引不是越多越好。每个写操作都要更新所有相关索引,高并发写入场景下,5 个索引可能比 1 个慢 3 倍以上——先看慢查询,再加索引,别预设。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

668

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

247

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

515

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

256

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

532

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

602

2023.08.14

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

31

2026.01.28

热门下载

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

精品课程

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

共48课时 | 1.9万人学习

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

共3课时 | 0.3万人学习

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

共1课时 | 812人学习

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

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