MySQL 虚拟列和虚拟索引的实现

 更新时间:2024年08月22日 10:00:15   作者:Q z1997  
虚拟列是MySQL 5.7开始引入的新特性,本文主要介绍了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 虚拟列和虚拟索引内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL数据库外键 foreing key

    MySQL数据库外键 foreing key

    这篇文章主要介绍了MySQL数据库外键 foreing key,外键表示了两个实体之间的联系,更多相关介绍需要的小伙伴可以参考一下
    2022-06-06
  • Mysql 5.7.18 解压版下载安装及启动mysql服务的图文详解

    Mysql 5.7.18 解压版下载安装及启动mysql服务的图文详解

    这篇文章主要介绍了Mysql 5.7.18 解压版下载安装及启动mysql服务的图文详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-05-05
  • MySQL定位长事务(Identify Long Transactions)的实现

    MySQL定位长事务(Identify Long Transactions)的实现

    在MySQL的运行中,经常会遇到一些长事务,本文主要介绍了MySQL定位长事务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-09-09
  • Mysql全文搜索match against的用法

    Mysql全文搜索match against的用法

    全文检索在 MySQL 中就是一个 FULLTEXT 类型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、 VARCHAR 或 TEXT 列上创建
    2011-10-10
  • mysql滑动订单问题原理与解决方法实例分析

    mysql滑动订单问题原理与解决方法实例分析

    这篇文章主要介绍了mysql滑动订单问题原理与解决方法,结合实例形式分析了mysql滑动订单的问题的基本原理、解决方法与相关操作注意事项,需要的朋友可以参考下
    2019-12-12
  • MySQL自连接与子查询方式

    MySQL自连接与子查询方式

    这篇文章主要介绍了MySQL自连接与子查询方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • MySql 字符集不同导致 left join 慢查询的问题解决

    MySql 字符集不同导致 left join 慢查询的问题解决

    当两个表的字符集不一样,在使用字符型字段进行表连接查询时,就需要特别注意下查询耗时是否符合预期,本文主要介绍了MySql 字符集不同导致 left join 慢查询的问题解决,感兴趣的可以了解一下
    2024-05-05
  • VS2022连接数据库MySQL并进行基本的表的操作指南

    VS2022连接数据库MySQL并进行基本的表的操作指南

    鉴于MySQL数据库的流行与强大,决定多学习使用,下面这篇文章主要给大家介绍了关于VS2022连接数据库MySQL并进行基本的表的操作指南,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • mysql8关闭binlog并清空Binlog的方法

    mysql8关闭binlog并清空Binlog的方法

    这篇文章主要介绍了mysql8关闭binlog并清空Binlog,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 详解MySQL中的NULL值

    详解MySQL中的NULL值

    这篇文章主要介绍了MySQL中的NULL值的相关知识,是MySQL入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05

最新评论