开发者

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

目录
  • 是什么
  • 能干嘛
  • 怎么用

是什么

mysql 5.7 中推出了一个非常实用的功能 虚拟列 Generated javascript(Virtual) Columns

在MySQL 5.7中,支持两种Generated Column,即Virtual Generated Column和Stored Generated Column,前者只将Generated Column保存在数据字典中(表的元数据),并不会将这一列数据持久化到磁盘上;后者会将Generated CJNEKbolumn持久化到磁盘上,而不是每次读取的时候计算所得。很明显,后者存放了可以通过已有数据计算而得的数据,需要更多的磁盘空间,与Virtual Column相比并没有优势,因js此,MySQL 5.7中,不指定Generated Column的类型,编程客栈默认是Virtual Column。

如果需要Stored Generated Golumn的话,可能在Virtual Generated Column上建立索引更加合适

综上,一般情况下,都使用Virtual Generated Column,这也是MySQL默认的方式

能干嘛

能对 where 条件 上使用函数等原因使索引失效 如使用函数 就可以对这个 字段和函数建立一个虚拟类和虚拟索引提高效率

怎么用

比如是 sys_user 表中 create_time

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

他是一个datetime 类型的

假设我们有一个查询

SELECT dayofweek(create_time) from  sys_user WHERE dayofweek(create_time) = 1 

结果

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

执行计划

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

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

建立一个虚拟列

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

ALTER TABLE `qzboot`.`sys_user` 
ADD COLUMN `create_time_dayofweek` tinyint(4)  GENERATED ALWAYS AS (dayofweek(create_time)) VIRTUAL ;

新建一个虚拟索引

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

ALTER TABLE `qzboot`.`sys_user` 
ADD INDEX `test`(`create_time_dayofweek`) USING BTREE COMMENT '虚拟索引';
SELECT dayofweek(create_time) from  sys_user WandroidHERE dayofweek(create_time) = 1

#  sql 改造
SELECT create_time_dayofweek from  sys_user WHERE create_time_dayofweek = 1 

结果

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

执行计划

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

虚拟列不存储在数据行中,但虚拟列的元数据信息会存在于相关系统表中,对虚拟列的添加或者删除只会涉及这些系统表,不会导致数据表的重建,所以效率很高

到此这篇关于MySQL 虚拟列和虚拟索引的实现的文章就介绍到这了,更多相关MySQL 虚拟列和虚拟索引内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新数据库

数据库排行榜