MySQL 8.0函数索引仅支持确定性、无副作用、可比较且不含子查询或变量的函数,如UPPER()、LOWER()、TRIM()、DATE()、YEAR()、SUBSTRING_INDEX()、JSON_EXTRACT()等;禁用NOW()、RAND()、UUID()、DATE_FORMAT()等非确定性函数,且语法必须严格——表达式须用双括号包裹,函数名需大写,否则建索引失败。

函数索引只对 WHERE 或 ORDER BY 中字面量完全匹配建索引表达式的查询生效,用错写法或函数就白建。
哪些函数能用在 MySQL 8.0 函数索引里
必须同时满足:确定性、无副作用、可比较、不含子查询或用户变量。常见可用的有:
-
UPPER()、LOWER()、TRIM()—— 适合邮箱/用户名忽略大小写查重 -
DATE()、YEAR()、MONTH()—— 但注意:YEAR(created_at) = 2026可走索引,created_at >= '2026-01-01'不行 -
SUBSTRING_INDEX(email, '@', -1)—— 提取域名做索引,适合按邮箱后缀筛选用户 -
JSON_EXTRACT(profile, '$.status')—— 需确保 JSON 值结构一致,否则索引可能不生效
绝对不能用的:NOW()、CURDATE()、RAND()、UUID()、DATE_FORMAT() —— 建索引直接报错。
建函数索引时最常踩的语法坑
MySQL 对 DDL 语法极其敏感,错一个括号或空格就失败:
- ✅ 正确:
CREATE INDEX idx_domain ON users ((SUBSTRING_INDEX(email, '@', -1)))(外层双括号 + 函数名大写) - ❌ 错误:
CREATE INDEX idx_domain ON users (SUBSTRING_INDEX(email, '@', -1))(缺最外层括号) - ❌ 错误:
CREATE INDEX idx_domain ON users (('SUBSTRING_INDEX(email, '@', -1)'))(引号包裹整个表达式) - ❌ 错误:
CREATE INDEX idx_domain ON users ((substring_index(email, '@', -1)))(函数名小写,严格模式下失败)
另外,函数索引名不能和已有列名重复。比如表里已有 name 列,就不能再建 (name) 的函数索引。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
函数索引 vs STORED 虚拟列 + 普通索引,怎么选
两者都能实现类似效果,但行为差异明显:
- 函数索引更轻量:不改表结构、不新增列、不占用额外存储空间;但不可被
SELECT *返回,且复用性弱 —— 只认建索引时写的那个表达式 - STORED 虚拟列 + 普通索引更稳:可显式查询该列、支持更多表达式组合、能参与覆盖索引;但要改表结构、增加一列、写入时多一次计算开销
- 如果只是临时加速某类固定查询(如
WHERE UPPER(name) = 'JOHN'),优先用函数索引;如果需要长期支持多种变形查询(比如还要查LOWER(name)、TRIM(name)),建议用虚拟列
验证函数索引是否真的生效
别光看 CREATE INDEX 成功了就以为完事。必须用 EXPLAIN 实测:
- 执行
EXPLAIN SELECT * FROM users WHERE UPPER(name) = 'JOHN',检查key字段是否显示你建的索引名,Extra是否没有Using filesort或Using temporary - 执行
EXPLAIN SELECT * FROM users WHERE name = 'john',确认它没走函数索引 —— 这是正常现象,不是 bug - 注意:函数索引不会出现在
SHOW INDEX的Column_name列中,它显示为(expression),别因此误判索引缺失
最易被忽略的一点:函数索引对 ORDER BY 生效的前提是排序表达式与建索引表达式完全一致,且方向一致 —— 比如建了 ((UPPER(name))),那 ORDER BY UPPER(name) 可以避免 filesort,但 ORDER BY UPPER(name) DESC 就不行(除非显式建降序函数索引,MySQL 8.0.13+ 支持)。










