讲师中心 微信公众号
AI工具推荐 视频效率加速

mysql8.0对比5.7索引有哪些新特性_详解不可见索引与函数索引

星瑶君_6704

星瑶君_6704

发布时间:2026-04-30 13:09:19

|

439人浏览过

|

来源于php中文网

原创

MySQL 8.0索引三大实质性升级是不可见索引、函数索引和降序索引:不可见索引支持软删除与灰度发布但主键不可设为不可见;函数索引需基于STORED生成列且WHERE必须严格匹配表达式;降序索引可消除filesort但ORDER BY方向须与索引定义完全一致。

mysql8.0对比5.7索引有哪些新特性_详解不可见索引与函数索引

MySQL 8.0 的索引能力相比 5.7 是实质性升级,不是小修小补。不可见索引(invisible index)和函数索引(functional index)是两个最实用的新特性,但它们的使用条件、生效逻辑和常见误用点非常具体——不按规则来,EXPLAIN 看不到效果,线上还可能出性能倒退。

不可见索引:软删除和灰度发布的底层支撑

不可见索引不是“禁用”,而是让优化器默认忽略它,但后台仍持续维护(写入、更新、B+树分裂等照常发生)。这意味着你删错索引的风险归零,也无需为测试新索引而停业务。

  • 主键绝对不能设为不可见:哪怕显式加 INVISIBLE,MySQL 会直接报错 ERROR 3092 (HY000): The primary key cannot be invisible
  • 唯一索引有隐藏限制:若表无主键,第一个 UNIQUE 索引会被 MySQL 自动当作主键处理,也无法设为不可见;第二个及之后的 UNIQUE 索引才可以
  • 强制走索引也无效:即使写 SELECT * FROM t1 WHERE j = 10 FORCE INDEX(j_idx),只要 j_idx 是不可见的,优化器仍会跳过它,不会报错也不会警告
  • 临时启用靠会话级开关:需先执行 SET SESSION optimizer_switch = "use_invisible_indexes=on",再跑 EXPLAIN 才能看到该索引被考虑;全局设置(GLOBAL)影响所有新连接,慎用

函数索引:让表达式也能走索引,但语法必须严格

MySQL 5.7 只能对列建索引,8.0 开始支持基于表达式的函数索引,比如 UPPER(name)、DATE(created_at)。但它不是“任意函数都行”,而是要求表达式可确定、无副作用、且必须用 GENERATED COLUMN 语义包装。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 必须显式声明虚拟列:不能直接 CREATE INDEX idx ON t1(UPPER(name)) —— 这在 8.0 会报错 ERROR 3753 (HY000): Functional index column cannot be used directly in index definition。正确写法是先加生成列:ALTER TABLE t1 ADD COLUMN name_upper VARCHAR(255) GENERATED ALWAYS AS (UPPER(name)) STORED,再对 name_upper 建索引
  • STORED 是硬性要求:函数索引只支持 STORED 类型的生成列,VIRTUAL 不行。因为索引需要物理存储值,而 VIRTUAL 列每次查询才计算,无法构建 B+ 树
  • WHERE 条件必须完全匹配表达式:如果建的是 UPPER(name) 索引,查询必须写 WHERE UPPER(name) = 'JOHN' 才能命中;写成 WHERE name = 'john' 或 WHERE LOWER(name) = 'john' 都不会用该索引
  • JSON 字段支持有限:可以对 JSON_EXTRACT(json_col, "$.field") 建函数索引,但仅限于提取标量值(string/number/boolean),不能对整个 JSON 对象或数组建索引

降序索引不是“锦上添花”,而是排序性能的关键开关

虽然标题没提降序索引,但它和不可见索引、函数索引同属 8.0 索引三大革新,且最容易被低估。它的价值不在“看起来更酷”,而在消除 Using filesort —— 尤其对分页、TOP-N 查询。

  • 定义即生效,无需额外配置:CREATE INDEX idx ON t1(a ASC, b DESC) 在 8.0 中真实按降序组织 B+ 树节点;5.7 同样语句会被静默转为全升序,SHOW CREATE TABLE 里根本看不到 DESC
  • ORDER BY 必须严格一致:索引是 (a ASC, b DESC),那只有 ORDER BY a, b DESC 能免排序;换成 ORDER BY a DESC, b DESC 反而可能触发反向扫描(Backward index scan),性能不如 5.7
  • 联合索引方向混合是常态:不要认为“全 ASC 最安全”。实际场景中,时间字段常需 DESC(最新优先),状态码常需 ASC(固定枚举),混合方向索引才是高频优化手段
  • EXPLAIN 的 key_len 会暴露细节:当查询只用到前导列(如索引 (a ASC, b DESC),查询 WHERE a = 1 ORDER BY b DESC),key_len 显示完整长度,说明走了索引排序;若出现 Using filesort,大概率是排序方向不匹配

真正难的不是语法,而是判断什么时候该用不可见索引做灰度、什么时候该用函数索引替代应用层转换、以及降序索引的方向是否和业务查询模式咬合。这三个特性都要求你对着 EXPLAIN 和真实慢查日志反复验证,而不是只看 DDL 是否执行成功。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

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

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

4443

2023.10.12

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

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

931

2023.10.27

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

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

1169

2024.02.23

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

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

6381

2024.03.06

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

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

3183

2024.03.06

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

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

6360

2024.04.07

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

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

8661

2024.04.29

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

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

1170

2024.04.29

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

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

精品课程

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

共1课时 | 189人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn