news 2026/6/15 16:51:12

MySQL 知识点:函数索引(Functional Index)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL 知识点:函数索引(Functional Index)

MySQL 技术文档:函数索引(Functional Index)

1. 概述

在 MySQL 8.0.13 之前,索引必须关联到表的列或列的前缀。如果查询条件对列使用了函数(如WHERE UPPER(name) = 'TOM'),即使name字段有索引,该索引也会失效。

函数索引允许在表达式或函数的结果上建立索引,从而使原本无法利用索引的复杂查询实现高性能。

2. 语法结构

创建函数索引的语法与普通索引类似,区别在于索引部分被包含在双括号内。

2.1 创建表时定义

CREATETABLEusers(idINTPRIMARYKEY,first_nameVARCHAR(50),last_nameVARCHAR(50),-- 创建函数索引:存储全名的长度INDEXidx_name_len((LENGTH(CONCAT(first_name,last_name)))));

2.2 在现有表上添加

ALTERTABLEt_erp_doc_credentialADDUNIQUEINDEXuk_active_code((IF(del_flag=1,credential_code,NULL)));

3. 实现原理

MySQL 内部将函数索引实现为隐藏的虚拟生成列(Virtual Generated Column)

  1. 当数据插入或更新时,MySQL 自动计算表达式的结果。
  2. 计算后的结果被存储在 B+ 树索引结构中。
  3. 优化器在解析 SQL 时,如果发现WHERE条件中的表达式与函数索引定义的表达式完全匹配,则直接引用该索引。

4. 关键应用场景

4.1 逻辑删除下的唯一性约束

这是最经典的应用。在包含逻辑删除字段(如del_flag)的表中,要求“未删除的数据唯一,已删除的数据可重复”。

  • 表达式UNIQUE INDEX ((IF(del_flag = 1, code, NULL)))
  • 原理:MySQL 唯一索引允许存在多个NULL值。

4.2 大写/小写不敏感查询

如果数据库字符集区分大小写,但业务需要快速进行不区分大小写的搜索:

  • 表达式INDEX ((UPPER(user_email)))

4.3 JSON 字段检索

针对 JSON 类型的某个 key 进行高频查询:

  • 表达式INDEX ((CAST(json_col->>'$.user_name' AS CHAR(30))))

5. 局限性与注意事项

5.1 语法严格匹配

查询 SQL 中的表达式必须与索引定义的表达式完全一致

  • 有效WHERE UPPER(name) = 'A'匹配INDEX ((UPPER(name)))
  • 无效WHERE name = 'a'无法直接利用INDEX ((UPPER(name)))

5.2 性能开销

  • 写入性能:每次INSERTUPDATE都会触发表达式计算,略微增加 CPU 负担。
  • 存储空间:虽然不增加可见列,但索引本身会在磁盘(.ibd文件)中占用空间。

5.3 算法限制

  • 函数索引不支持ALGORITHM=INPLACE。添加该索引时通常会触发COPY算法(锁表),在生产环境大型表操作时需谨慎。

5.4 维护规范

  • 函数索引中的函数必须是确定性函数(Deterministic)。例如,不能使用NOW()RAND(),因为它们的值随时间改变。
  • 主键不能是函数索引。

6. 性能验证

使用EXPLAIN命令观察Extra列。如果看到Using indexkey命中,说明函数索引生效。

EXPLAINSELECT*FROMusersWHERELENGTH(CONCAT(first_name,last_name))>10;

7. 总结

函数索引是 MySQL 8.0 迈向现代数据库的重要一步。它不仅减少了冗余物理列的创建(原本需要手动创建生成列再加索引),还为复杂的业务逻辑优化提供了极大的灵活性。

建议:在处理逻辑删除唯一性、JSON 搜索或历史遗留的复杂查询优化时,优先考虑函数索引。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 15:35:52

cesium 根据经纬度高度进行额度补偿

const offsetvalue 90; /***度数补偿值*/ const setCameraPosition async (lat: number, lon: number, du: number) > {var point turf.point([lat, lon]);var distance 600 * 1.732;var bearing du - 180 offsetvalue;var options: any { units: "kilometers&q…

作者头像 李华
网站建设 2026/6/15 0:27:00

Kyutai团队的新突破:让AI看图片更便宜的神奇方法

在计算机视觉和人工智能快速发展的今天,让机器既能看懂图片又能理解文字变得越来越重要。就在2024年12月,来自法国人工智能研究机构Kyutai的研究团队发表了一项引人注目的研究成果,为这个看似复杂的技术难题提供了一个既巧妙又实用的解决方案…

作者头像 李华
网站建设 2026/6/15 14:43:50

完整理解乐观锁(以预定系统为例)

乐观锁:并发控制的智慧之道什么是乐观锁?乐观锁(Optimistic Locking)是一种并发控制机制,其核心思想是"假设冲突很少发生"。与悲观锁(Pessimistic Locking)不同,悲观锁在访…

作者头像 李华
网站建设 2026/6/15 14:42:33

MySQL 日志体系总览

MySQL 日志体系总览MySQL 的日志是数据库运行状态、操作行为、故障排查的核心依据,主要分为管理类日志(错误、通用查询、慢查询)、复制类日志(二进制、中继)、事务类日志(重做、回滚)三大类&…

作者头像 李华
网站建设 2026/6/15 13:16:07

2025必备10个降AIGC工具,MBA人必看!

2025必备10个降AIGC工具,MBA人必看! AI降重工具:MBA人不可忽视的高效利器 随着人工智能技术在学术写作中的广泛应用,论文中出现的AIGC痕迹和查重率问题日益受到关注。尤其对于MBA学生而言,如何在保持学术严谨性的同时有…

作者头像 李华
网站建设 2026/6/15 13:17:09

当数据分析遇上AI:airda让你用聊天的方式玩转SQL

引子:数据分析师的痛点 你有没有遇到过这样的场景? 老板突然冲进办公室:"小王,帮我查一下上个月华东区销售额前十的产品!"你心里一紧,打开数据库管理工具,开始在几百张表里翻找。sa…

作者头像 李华