MySQL 虚拟列和虚拟索引的实现
是什么
Mysql 5.7 中推出了一个非常实用的功能 虚拟列 Generated (Virtual) Columns
在MySQL 5.7中,支持两种Generated Column,即Virtual Generated Column和Stored Generated Column,前者只将Generated Column保存在数据字典中(表的元数据),并不会将这一列数据持久化到磁盘上;后者会将Generated Column持久化到磁盘上,而不是每次读取的时候计算所得。很明显,后者存放了可以通过已有数据计算而得的数据,需要更多的磁盘空间,与Virtual Column相比并没有优势,因此,MySQL 5.7中,不指定Generated Column的类型,默认是Virtual Column。
如果需要Stored Generated Golumn的话,可能在Virtual Generated Column上建立索引更加合适
综上,一般情况下,都使用Virtual Generated Column,这也是MySQL默认的方式
能干嘛
能对 where 条件 上使用函数等原因使索引失效 如使用函数 就可以对这个 字段和函数建立一个虚拟类和虚拟索引提高效率
怎么用
比如是 sys_user 表中 create_time

他是一个datetime 类型的
假设我们有一个查询
SELECT dayofweek(create_time) from sys_user WHERE dayofweek(create_time) = 1
结果

执行计划

如果我们为create_time 字段 建立索引 这个查询语句 仍然无法使用索引 因为 函数 阻止了索引 (这里就不实验了啊 有兴趣可以自己试试 肯定没用)
建立一个虚拟列

ALTER TABLE `qzboot`.`sys_user` ADD COLUMN `create_time_dayofweek` tinyint(4) GENERATED ALWAYS AS (dayofweek(create_time)) VIRTUAL ;
新建一个虚拟索引

ALTER TABLE `qzboot`.`sys_user` ADD INDEX `test`(`create_time_dayofweek`) USING BTREE COMMENT '虚拟索引';
SELECT dayofweek(create_time) from sys_user WHERE dayofweek(create_time) = 1 # sql 改造 SELECT create_time_dayofweek from sys_user WHERE create_time_dayofweek = 1
结果

执行计划

虚拟列不存储在数据行中,但虚拟列的元数据信息会存在于相关系统表中,对虚拟列的添加或者删除只会涉及这些系统表,不会导致数据表的重建,所以效率很高
到此这篇关于MySQL 虚拟列和虚拟索引的实现的文章就介绍到这了,更多相关MySQL 虚拟列和虚拟索引内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Windows10下mysql 8.0.12解压版安装配置方法图文教程
这篇文章主要为大家详细介绍了Windows10下mysql 8.0.12解压版安装方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-08-08
MySQL日期格式化yyyy-mm-dd详解(DATE_FORMAT()函数)
MySQL提供了很多功能强大、方便易用的函数,在进行数据库管理以及数据的查询和操作时,帮助我们提高对数据库的管理效率,下面这篇文章主要给大家介绍了关于MySQL日期格式化yyyy-mm-dd(DATE_FORMAT()函数)的相关资料,需要的朋友可以参考下2023-01-01
MySQL 中 DATE_FORMAT() 函数的使用及应用场景
DATE_FORMAT() 是 MySQL 中的一个内置函数,用于格式化日期和时间数据,它可以根据指定的格式字符串来展示日期和时间,使得数据更容易阅读和理解,本文档将详细介绍 DATE_FORMAT() 函数的使用方法及其常见应用场景,感兴趣的朋友一起看看吧2024-12-12
MySQL datetime类型与时间、日期格式字符串大小比较的方法
这篇文章主要介绍了MySQL datetime类型与时间、日期格式字符串大小比较,本文使用的是mysql8.0.27版本,其他版本自测一下,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-11-11


最新评论