Optimizer Use of Generated Column Indexes

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: MySQL支持对生成的列进行索引并利用这些索引优化查询执行计划。即使查询未直接引用生成列,只要表达式与生成列定义匹配,优化器也会自动使用索引。但表达式需与生成列定义完全一致且结果类型相同。此功能适用于特定运算符如=、<、BETWEEN等。生成列定义需含函数调用或指定运算符。对于JSON值的比较,使用`JSON_UNQUOTE()`以确保正确匹配。若优化器未选择合适索引,可使用索引提示调整。

MySQL支持对生成的列进行索引。例如:

image.png

生成的列gc定义为表达式f1+1。该列也被索引,优化器可以在执行计划构建过程中考虑该索引。在以下查询中,WHERE子句引用gc,优化器考虑该列上的索引是否会产生更有效的计划:
image.png

优化器可以在生成的列上使用索引来生成执行计划,即使在查询中没有按名称直接引用这些列的情况下也是如此。如果WHERE、ORDER BY或GROUP BY子句引用的表达式与某个索引生成列的定义匹配,则会发生这种情况。以下查询不直接引用gc,但确实使用了与gc定义匹配的表达式:

image.png

优化器识别出表达式f1+1与gc的定义匹配,并且gc已被索引,因此它在执行计划构建过程中会考虑该索引。您可以使用EXPLAIN看到这一点:

image.png

实际上,优化器已将表达式f1+1替换为与表达式匹配的生成列的名称。这在SHOW WARNINGS显示的扩展EXPLAIN信息中提供的重写查询中也很明显:

image.png

以下限制和条件适用于优化器对生成的列索引的使用:
为了使查询表达式与生成的列定义匹配,该表达式必须相同,并且必须具有相同的结果类型。例如,如果生成的列表达式是f1+1,如果查询使用1+f1,或者如果将f1+1(整数表达式)与字符串进行比较,优化器将无法识别匹配。
优化适用于这些运算符:=、<、<=、>、>=、BETWEEN和IN()。
对于BETWEEN和IN()以外的运算符,任何一个操作数都可以被匹配的生成列替换。对于BETWEEN和IN(),只有第一个参数可以被匹配的生成列替换,其他参数必须具有相同的结果类型。BETWEEN和IN()尚不支持涉及JSON值的比较。
生成的列必须定义为至少包含一个函数调用或前一项中提到的运算符之一的表达式。表达式不能包含对另一列的简单引用。例如,gc INT AS(f1)STORED仅包含一个列引用,因此不考虑gc上的索引。
为了将字符串与从返回引号字符串的JSON函数计算值的索引生成列进行比较,需要在列定义中使用JSON_UNQUOTE()来删除函数值中的额外引号。(对于字符串与函数结果的直接比较,JSON比较器会处理引号删除,但索引查找不会发生这种情况。)例如,与其编写这样的列定义:

image.png

这样写:

image.png

使用后一种定义,优化器可以检测到这两种比较的匹配:

image.png

如果列定义中没有JSON_UNQUOTE(),优化器只会检测到第一个比较的匹配。
如果优化器未能选择所需的索引,则可以使用索引提示迫使优化器做出不同的选择。

相关文章
|
8月前
|
机器学习/深度学习 C语言 计算机视觉
RT-DETR改进策略【Neck】| HS-FPN:高级筛选特征融合金字塔,加强细微特征的检测
RT-DETR改进策略【Neck】| HS-FPN:高级筛选特征融合金字塔,加强细微特征的检测
257 12
RT-DETR改进策略【Neck】| HS-FPN:高级筛选特征融合金字塔,加强细微特征的检测
|
机器学习/深度学习 算法 数据挖掘
PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享(上)
PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享
|
存储 数据挖掘 Linux
Linux命令split详解:大文件处理的得力助手
`split`命令是Linux用于将大文件分割成小文件的工具,常用于日志处理、备份。它支持按行数(-l)、字节数(-b)分割,并能自定义输出文件名(-a, -d)。例如,`split -b 10M largefile.txt smallfile_`会按10MB切割`largefile.txt`,生成`smallfile_`开头的文件。注意确保磁盘空间充足,避免文件名冲突,并备份原始文件。结合其他命令使用,能提高文件管理效率。
|
域名解析 网络协议 网络安全
WordPress搭建个人博客
这篇文章将手把手地指导你如何快速完成WordPress的搭建。你可以利用WordPress搭建个人博客,甚至企业官方网站。只要你跟着本文的步骤走,即使小白也能轻松搞定WordPress网站搭建。首选你需要购买一个vps,并将你的域名解析到vps;然后连接你的VPS,在vps上执行命令一键安装WordPress;再接下来就是初始化你的WordPress了,安装Argon模板、安装RankMath SEO插件、安装webp图片速度优化插件
749 2
WordPress搭建个人博客
|
存储 传感器 网络协议
通信协议缓冲区管理全景:TCP、UDP、ZMQ、DBus、SSL、SOME/IP通讯协议的缓冲区解析...
通信协议缓冲区管理全景:TCP、UDP、ZMQ、DBus、SSL、SOME/IP通讯协议的缓冲区解析...
612 0
|
安全 C++
C++标准库中的锁lock_guard、unique_lock、shared_lock、scoped_lock、recursive_mutex
C++标准库中的锁lock_guard、unique_lock、shared_lock、scoped_lock、recursive_mutex
790 0
|
XML JSON 监控
应用程序接口(API)安全的入门指南
对于初学者来说,API 是指为两个不同的应用之间实现流畅通信,而设计的应用程序编程接口。它通常被称为应用程序的“中间人”。由于我们需要保护用户的持有数据、以及应用本身的完整性,因此 API 的安全性是一种“刚需”。 而对于开发人员而言,API 是一个非常好的工具。它可以在微服务和容器之间交换信息,并实现快节奏的通信交流。正如集成和互连对于应用开发的重要性那样,API 在某种程度上,驱动并增强了应用程序的设计
|
JSON 数据格式
@JsonProperty与@JSONField注解用处
@JsonProperty与@JSONField注解用处
|
云安全 弹性计算 监控
企业上云等保三级最佳实践
本篇内容分享了企业上云等保三级最佳实践。
企业上云等保三级最佳实践
|
消息中间件 NoSQL Go
Kratos微服务框架下实现分布式任务队列
提起分布式任务队列(Distributed Task Queue),就不得不提Python的Celery。而Asynq和Machinery就是GO当中类似于Celery的分布式任务队列。
2655 0
Kratos微服务框架下实现分布式任务队列
下一篇
oss教程