MySQL8.0.13-函数索引

news2024/9/21 18:59:00

目录

什么是函数索引

语法

函数索引测试

创建表结构

插入数据

创建普通索引

查看执行计划

创建函数索引

查看执行计划

查看索引信息

函数索引效率

普通索引

函数索引

分析

注意事项

老版本如何实现函数索引


什么是函数索引

本篇主要介绍 MySQL 的函数索引(也叫表达式索引)。

通常来讲,索引都是基于字段本身或者字段前缀,而函数索引是基于字段本身加上函数、操作符、表达式等计算而来。如果将表达式或者操作符也看做函数的话,简单来说,这样的索引就可以统称函数索引。

MySQL 的函数索引内部是基于虚拟列(generated columns)实现,不同于直接定义虚拟列,函数索引自动创建的虚拟列本身实时计算结果,并不存储数据,只把函数索引本身存在磁盘上。

MySQL 8.0.13 之前不支持函数索引,所以老版本包括现在主流的 MySQL 5.7 也不支持函数索引,需要手工模拟创建或者改 SQL。

语法

创建函数索引的基本语法如下:

CREATE INDEX index_name ON table_name (expression);

或者,如果正在修改表并添加新的索引,可以使用:

ALTER TABLE table_name ADD INDEX index_name (expression);

这里的 expression 可以是列名、列名的函数(如 LOWER(column_name))、列名的计算(如 column_name * 2)或其他有效的 SQL 表达式。

以下是一些创建函数索引的例子:

  • 对字符串列的特定转换进行索引
CREATE INDEX idx_lastname_lowercase ON customers (LOWER(last_name));
  • 对日期列的特定格式进行索引
CREATE INDEX idx_birthdate ON users (DATE(birthdate));
  • 对数值列的计算结果进行索引
CREATE INDEX idx_price_times_two ON products (price * 2);
  • 对 JSON 列的路径表达式进行索引
CREATE INDEX idx_json_column ON json_table (JSON_EXTRACT(json_column, '$.path.to.value'));

请注意,不是所有的函数都适合用于函数索引。函数必须是确定性的,这意味着对于相同的输入,函数总是返回相同的结果。此外,函数索引的使用也受到存储引擎的限制,例如,InnoDB 支持函数索引,而 MyISAM 不支持。

函数索引测试

创建表结构

CREATE TABLE idx_test (
    id INT AUTO_INCREMENT PRIMARY KEY,
    col1 INT,
    col2 INT,
    col3 VARCHAR(30),
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

插入数据

insert into idx_test values (1,10,10,'helloworld','2021-01-01 00:00:00'),
(2,20,20,'hellochina','2021-02-02 00:00:00'),  
(3,30,30,'hellojap','2021-03-03 00:00:00'),
(4,40,40,'hellorus','2021-04-04 00:00:00'),
(5,50,50,'helloita','2021-05-05 00:00:00');

创建普通索引

alter table idx_test add index idx_create_time(create_time);

查看执行计划

explain select * from idx_test where date(create_time)='2021-01-01';

创建函数索引

alter table idx_test add index fun_create_time((date(create_time)));

查看执行计划

alter table idx_test add index fun_create_time((date(create_time)));

查看索引信息

show index from idx_test ;

函数索引效率

如果两条 sql 一个用到普通索引,一个用到函数索引,结果集一致,那哪个 sql 的开销会大点?

普通索引

#普通索引:
select * from idx_test where create_time > '2021-02-02 00:00:00' and create_time <='2021-03-03 00:00:00';

查看详细执行计划

explain format=json select * from idx_test where create_time > '2021-02-02 00:00:00' and create_time <='2021-03-03 00:00:00'\G

函数索引

#用到函数索引:
select * from idx_test where date(create_time)='2021-03-03';

查看详细执行计划

explain format=json select * from idx_test where date(create_time)='2021-03-03'\G

分析

普通索引的开销会大点,也比较符合预期,本来建立函数索引就是为了查询更为高效。总的来看,函数索引在特定场景还是很有用处的,只要严格遵守函数索引的定义去编写 sql,那就能大大减少不必要的开销。

注意事项

  1. 表达式括号:在创建函数索引时,需要将表达式放入括号中,以区分于普通列索引或前缀索引。例如,创建一个基于 DATE() 函数的索引应该这样写:ALTER TABLE table_name ADD INDEX index_name((DATE(column_name)));
  2. 函数限制:函数索引中的表达式不能使用列的前缀,也不能包含非确定性的函数,如 NOW()RAND() 等。此外,不能使用子查询、参数、变量、存储函数以及自定义函数。只有确定性的函数才能用于创建函数索引。
  3. 索引类型:虽然普通索引支持前缀索引,但函数索引不支持字段的前缀索引。如果需要对字段的前缀进行索引,可以使用 SUBSTRING()CAST() 函数作为替代方案。
  4. 性能考虑:函数索引在查询时动态计算其值,这可能会影响性能,尤其是在数据量大或表达式复杂的情况下。因此,在创建函数索引之前,应该进行性能测试,确保它确实能够提高查询效率。
  5. 存储引擎限制:函数索引仅在某些存储引擎中受支持,如 InnoDB。在使用函数索引之前,确保它与你的存储引擎兼容。
  6. 索引维护:创建函数索引时,MySQL 会在内部创建一个隐藏的虚拟列,并在该虚拟列上创建索引。这意味着函数索引的维护与普通索引类似,但需要注意虚拟列的存在。
  7. 查询优化:在使用函数索引时,查询条件必须与索引定义的表达式完全一致,才能确保查询优化器使用该索引。例如,如果函数索引是基于 UPPER(column_name) 创建的,那么查询条件也应该是 UPPER(column_name) = 'SOMEVALUE'
  8. 特殊数据类型:对于 JSON 数据类型,函数索引可以用于优化 JSON 列的查询,但需要注意 JSON_UNQUOTE() 函数和 CAST() 函数在索引和查询中的使用,因为它们可能影响索引的可见性和查询性能。
  9. 索引数量:虽然函数索引可以提高查询性能,但过多的索引会增加数据库的维护成本,因此应该根据实际需求合理创建索引。
  10. 版本限制:函数索引是在 MySQL 8.0.13 版本中引入的,因此需要确保你的 MySQL 版本支持此特性。

老版本如何实现函数索引

函数索引是 MySQL 8.0.13 才有的。那在老的版本如何实现呢?

MySQL 5.7 自持虚拟列,只需要在虚拟列上创建一个普通索引就行。

MySQL 5.6 以及 MySQL 5.5 等,则需要自己定义一个冗余列,然后定期更新这列内容。当然最核心的是如何规划好定期更新内容这块。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2140196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】顺序表和链表经典题目

系列文章目录 单链表 动态顺序表实现通讯录 顺序表 文章目录 系列文章目录前言一、顺序表经典例题1. 移除元素2. 合并两个有序数组 二、链表经典例题1. 移除链表元素2. 反转链表3. 合并两个有序链表4. 链表的中间节点5. 环形链表的约瑟夫问题 总结 前言 我们通过前面对顺序表…

NVM(node.js版本工具)的使用

1.nvm是什么 NVM 是 Node Version Manager 的缩写&#xff0c;它是一个用于管理 Node.js 版本的命令行工具。通过NVM&#xff0c;你可以在同一台机器上安装和切换多个 Node.js 版本&#xff0c;对于开发和测试在不同 Node.js 版本上运行的应用程序非常有用。 2.下载 下载之前…

『功能项目』眩晕图标显示【52】

我们打开上一篇51调整Boss技能bug的项目&#xff0c; 本章要做的事情是在释放法师的眩晕技能时&#xff0c;boss01处在眩晕动画时显示一个眩晕图标 首先双击Boss01预制体进入预制体空间 创建一个Image重命名为StateUIdiz 代表第一个受击状态 设置Canavas 并且修改Canvas的渲染…

Java 学习全攻略:从入门到精通的详细指南

目录 一、引言 Java 的背景和发展 学习 Java 的意义 二、Java 的核心特性 1. 面向对象编程&#xff08;OOP&#xff09; 2. 跨平台性 3. 自动内存管理 4. 强大的标准库 三、Java 基础语法 1. 变量和数据类型 原始数据类型 引用数据类型 2. 运算符 3. 控制结构 条…

柳淘鸿黄金沁透发热面膜:肌肤逆龄之旅的秘密武器!

柳淘鸿黄金沁透发热面膜&#xff1a;肌肤逆龄之旅的秘密武器&#xff01;"柳淘鸿的黄金沁透发热面膜液融合了中国发明专利,专利号:ZL202310228041.5对应成分:胶原, 金&#xff0c;珍珠粉以及多种珍贵植物萃取精华&#xff0c;是肌肤逆龄之旅的绝密武器。这款面膜液温和滋养…

Git之误执行git rm -r解决方案(六十七)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

视频分割操作教程

1、打开剪映 2、点击开始创作上面的“”&#xff0c;选择视频&#xff0c;点击添加按钮&#xff0c;导入一个视频素材到剪映 3、滑动视频&#xff0c;让视频竖线到合适位置 4、点击视频&#xff0c;出现白色边框 5、点击工具栏“分割”&#xff0c;然后点击需要删除的视频部分 …

03 战略的本质与实践 - 战略管理实践的启示

1,战略有一定复杂性。在学术界就有很多学派。明斯伯格,加拿大的管理学家,认为有10大学派。 我看来有三个方面: 理性学派:通过规划、主动管理 演进学派:根据一个不确定性的环境,自发自下而上来形成 过程管理:重要的不是结果,而是过程 简单的看,如下图。 显示公司自己的…

查询分类数据序列中的每个类别 Series.cat.categories

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 1.定义分类序列s 2.查询s中的各类别 Series.cat.categories 选择题 关于以下代码输出结果的说法中正确的是? import pandas as pd s pd.Series([a,b,a,b], dtypecategory) print("【…

windows系统安装docker

参考&#xff1a;GitHub - tech-shrimp/docker_installer: Docker官方安装包&#xff0c;用来解决因国内网络无法安装使用Docker的问题 1.windows系统安装docker cmd 右键 以管理员身份运行 输入 wsl --set-default-version 2 wsl --update --web-download GitHub - tech-s…

系统架构设计师教程 第5章 5.2 需求工程 笔记

5.2 需求工程 ★★★★★ 软件需求是指用户对系统在功能、行为、性能、设计约束等方面的期望。 软件需求包括3个不同的层次&#xff1a;业务需求、用户需求和功能需求(也包括非功能需求)。 (1)业务需求 (business requirement) 反映了组织机构或客户对系统、产品高层次的目标…

Flutter启动无法运行热重载

当出现这种报错时&#xff0c;大概率是flutter的NO_Proxy出问题。 请忽略上面的Android报错因为我做的是windows开发这个也就不管了哈&#xff0c;解决下面也有解决报错的命令大家执行一下就行。 着重说一下Proxy的问题&#xff0c; 我们看到提示NO_PROXY 没有设置。 这个时候我…

掌握ZooKeeper的业务使用场景,ZooKeeper如何实现分布式锁

1. ZooKeeper分布式锁 1.1 排他锁实现分布式锁 面试官&#xff1a;知道Zookeeper有什么应用场景吗? 目前地球村里大型公司部署的分布式技术&#xff0c;绝大部分都是由Zookeeper提供底层的技术支持&#xff0c;所以Zookeeper多么重要就不用我多说了吧。 我们可以利用Zookeep…

多态(下)【C++】

抽象类 抽象类的定义 只要有纯虚函数的类就是抽象类 什么是纯虚函数&#xff1f; 纯虚函数是一种特殊的虚函数&#xff0c;它是没有函数体的虚函数 纯虚函数的语法&#xff1a; class <类名> { public:virtual <类型><函数名>(<参数表>) 0; };…

基于 jenkins 的持续集成、持续部署方案

工具介绍 python3.12 fastapi 0.92.0 uvicorn 开发部署web项目&#xff1b;git gitee 实现代码版本管理&#xff1b;jenkins docker 实现持续集成、持续部署&#xff1b;centos7 作为jenkins服务器 & 部署服务器&#xff1b;有条件的可以再启动一台服务器作为部署测试…

【Elasticsearch系列六】系统命令API

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

‌内网穿透技术‌总结

内网穿透是一种网络技术&#xff0c;通过它可以使外部网络用户访问内部网络中的设备和服务。一般情况下&#xff0c;内网是无法直接访问的&#xff0c;因为它位于一个封闭的局域网中&#xff0c;无法从外部访问。而通过内网穿透&#xff0c;可以将内部网络中的设备和服务暴露在…

2024年TCGA基因表达数据下载(最新版)

文章目录 前言一、如何使用TCGA数据库获取公共数据?二、使用步骤1.点击Cohort Builder2.数据筛选3. Repository4.数据下载4.1 继续选择筛选条件4.2 添加cart并进入4.3 下载 总结 前言 TCGA 全称 The Cancer Genome Atlas &#xff0c;即癌症基因组图谱。它是一个大型的癌症研…

【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧

文章目录 Python NumPy学习指南前言第六部分&#xff1a;NumPy在科学计算中的应用1. 数值积分使用梯形规则进行数值积分使用Simpson规则进行数值积分 2. 求解微分方程通过Euler方法求解一阶常微分方程使用scipy.integrate.solve_ivp求解常微分方程 3. 随机过程模拟模拟布朗运动…

Linux下进程间的通信--共享内存

共享内存概述&#xff1a; 共享内存是进程间通信的一种方式&#xff0c;它允许两个或多个进程共享一个给定的存储区。共享内存是最快的一种IPC形式&#xff0c;因为它允许进程直接对内存进行读写操作&#xff0c;而不需要数据在进程之间复制。 共享内存是进程间通信&#xff…