MySQL5.7 虚拟列实现表达式或函数索引

http://www.linuxidc.com/Linux/2015-11/125162.htm

https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html
语法
col_name data_type [GENERATED ALWAYS] AS (expression)
  [VIRTUAL | STORED] [UNIQUE [KEY]] [COMMENT comment]
  [[NOT] NULL] [[PRIMARY] KEY]
 
[GENERATED ALWAYS]:非必须
VIRTUAL:计算列只不会存储,建议在计算列上加索引
STORED:计算列值会被存储,建议在计算列上加索引

[UNIQUE [KEY]] [COMMENT comment]  [[NOT] NULL] [[PRIMARY] KEY] 这些属性跟普通列属性一样,但是区别在于的顺序不能随意掉乱
比如[UNIQUE [KEY]]不能放在[COMMENT comment]之后,一定要按照[UNIQUE [KEY]] [COMMENT comment]  [[NOT] NULL] [[PRIMARY] KEY]

一张表里可以存在VIRTUAL类型计算列,也可以存在STORED类型计算列
一个表里的计算列可以引用同一个表里的另一个计算列
计算列不能使用 AUTO_INCREMENT 计算列表达式里也不能使用有 AUTO_INCREMENT的普通列
CREATE TABLE ... LIKE和CREATE TABLE ... SELECT都不允许导入计算列
表分区支持计算列
对于INSERT, REPLACE,  UPDATE,replaced, 计算列那列只能用default这个值,当然不指定显式插入计算列也是可以的
insert into tt(id,mod_id) values(22,default);

insert into t13(id,log_time,log_date)  values(4,'2017-3-23',default);
Query OK, 1 row affected (0.02 sec)

insert into t13(id,log_time)  values(5,'2017-5-23');
Query OK, 1 row affected (0.02 sec)

select * from t13;
+----+---------------------+------------+
| id | log_time            | log_date   |
+----+---------------------+------------+
|  1 | 2017-02-13 00:00:00 | 2017-02-13 |
|  2 | 2017-02-13 00:00:00 | 2017-02-13 |
|  4 | 2017-03-23 00:00:00 | 2017-03-23 |
|  5 | 2017-05-23 00:00:00 | 2017-05-23 |
+----+---------------------+------------+

CREATE TABLE t11 (
id INT PRIMARY KEY ,
log_time DATETIME,
log_date DATE AS (DATE(log_Time)) stored
) ENGINE INNODB ;

ALTER TABLE t1 ADD KEY idx_log_date(log_date);

CREATE TABLE t12 (
id INT PRIMARY KEY ,
log_time DATETIME,
log_date DATE  AS (DATE(log_Time)) VIRTUAL
) ENGINE INNODB ;

ALTER TABLE t1 ADD KEY idx_log_date(log_date);

可以用来做函数索引,也可称为表达式索引,也就是基于字段以特定函数(表达式)建立索引来提升查询性能之需。函数索引的优势在于更加精确的获取所需要的数据。

CREATE TABLE t1 (
id INT PRIMARY KEY ,
rank INT,
log_time DATETIME,
nickname VARCHAR (64),
log_date DATE AS (DATE(log_Time)) stored
) ENGINE INNODB ; ALTER TABLE t1 ADD KEY idx_log_date(log_date);

或者

CREATE TABLE t1 (
id INT PRIMARY KEY ,
rank INT,
log_time DATETIME,
nickname VARCHAR (64)
) ENGINE INNODB ;
ALTER TABLE t1 ADD COLUMN log_date DATE AS (DATE(log_Time)) stored;
ALTER TABLE t1 ADD KEY idx_log_date(log_date);

这样,增加了一新列,用来存放date(log_time)这个表达式,并且给他加了一列索引。

那么,之前的语句就变成如下:

mysql> SELECT * FROM t1 WHERE log_date = '2015-04-09'\G
*************************** 1. row ***************************
id: 95
rank: 24
log_time: 2015-04-09 05:53:13
nickname: test
log_date: 2015-04-09
*************************** 2. row ***************************
id: 3423
rank: 42
log_time: 2015-04-09 02:55:38
nickname: test
log_date: 2015-04-09
2 rows in set (0.00 sec)

执行后结果集和之前的一致。

我们来看看查询计划,发现很好的利用了 idx_log_date 索引列。

mysql> explain SELECT * FROM t1 WHERE log_date = '2015-04-09'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t1
partitions: NULL
type: ref
possible_keys: idx_log_date
key: idx_log_date
key_len: 4
ref: const
rows: 2
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)

利用到idx_log_date 索引

MySQL5.7 虚拟列实现表达式或函数索引的更多相关文章

  1. 使用mysql5.7新特性(虚拟列)解决使用前通配符性能问题

    众所周知,在mysql里的后通配符可以使用索引查找,前通配查询却无法使用到索引,即使是使用到了索引,也是使用了索引全扫描,效率依然不高,再MySQL5.7之前,一直都没有好的办法解决,但是到了MySQ ...

  2. MySQL 5.7 虚拟列 (virtual columns)

    参考资料: Generated Columns in MySQL 5.7.5 MySQL 5.7新特性之Generated Column(函数索引) MySQL 5.7原生JSON格式支持 Gener ...

  3. Oracle 11g 虚拟列 Virtual Column介绍

    Oracle 11G 虚拟列 Virtual Column Oracle 11G 在表中引入了虚拟列,虚拟列是一个表达式,在运行时计算,不存储在数据库中,不能更新虚拟列的值. 定义一个虚拟列的语法: ...

  4. MySQL 5.7 虚拟列 (virtual columns)(转)

    原文地址:https://www.cnblogs.com/raichen/p/5227449.html 参考资料: Generated Columns in MySQL 5.7.5 MySQL 5.7 ...

  5. [oracle 11g 新特性] virtual column虚拟列

    总结:虚拟列可以使用于一些特殊场合,实质是类似于函数列(即以 表中已有的列 经过函数运算得来),“虚拟列不存储在数据库中,是在执行查询时由oracle后台计算出来返回给用户”,因此虚拟列不会增加存储空 ...

  6. Oracle 11g 新特性(一)-- 虚拟列

    数据库版本: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Oracle11g 增加了虚拟列的新特性, 具体说明如 ...

  7. MariaDB扩展特性--虚拟列

    存在于表中的列,它们的值是根据确定的表达式或者是根据表中其他列的值自动计算的. 虚拟列有两种,分别对应了定义虚拟列的修饰关键词: 'VIRTUAL'修饰词含义为该虚拟列的值会在查询的时候计算生成. ' ...

  8. ORACLE-1:虚拟列影响alter修改表字段操作!

    一.问题: 昨天想要修改Oracle数据库中某张表的某个字段,发现怎么都修改不成功!!!并给出了如下提示: ORA-54031:要删除或修改的列由某个虚拟列表达式使用 二.啥是“虚拟列” [不可见的列 ...

  9. MYSQL5.7生成列简介及创建

    1.说明 生成列是由已存在的字段通过表达式计算得来的 2.生成列类型 VIRTUAL,即虚拟类型,字段值不实际存储,当读取行时再计算,虚拟列类型不占存储 STORED,即存储类型,字段值会实际存储起来 ...

随机推荐

  1. Atitit 热烈庆祝读经器项目圆满完成

    Atitit 热烈庆祝读经器项目圆满完成 1.1. 读经器项目简单介绍 1 1.2. 一万小时定律和十年一个专家定律 1 1.3. 获得加持前景 1 1.4. 核心源码 1 1.5. 项目git 2 ...

  2. Android中APK签名工具之jarsigner和apksigner详解

    一.工具介绍 jarsigner是JDK提供的针对jar包签名的通用工具, 位于JDK/bin/jarsigner.exe apksigner是Google官方提供的针对Android apk签名及验 ...

  3. 配置gradle的daemon

    文档里提到,配置Daemon,能够加速gradle的构建,为了获取这个性能提上,我也得开启这个Daemon. 在Windows环境下:,可以执行这个命令 (if not exist "%US ...

  4. Gin框架初识

    一.安装 使用go下载gin库,命令行输入:go get github.com/gin-gonic/gin ,一般使用需要的依赖: import "github.com/gin-gonic/ ...

  5. springboot-aop

    AOP(面向切面编程)是Spring的两大核心功能之一,功能非常强大,为解耦提供了非常优秀的解决方案. 现在就以springboot中aop的使用来了解一下如何使用aop. 写几个简单的Spring ...

  6. IDEA2018.2破解方法

    前言 之前也试过多种方式,但是总是使用了一会儿又需要破解,今天又找了一个,不知道可以使用多久. 目前看是可以破解开的,所以分享一下. 适用于JetBrain旗下版本为2.3或2.4的所有产品 一.在 ...

  7. [原]win10下编译lua5.3.4

    1.下载lua源码http://www.lua.org/ftp/ 2.打开vs2012工具命令提示 3.cd 到lua源码的src目录 4.依次执行以下代码 cl /MD /O2 /c /DLUA_B ...

  8. VS 错误: 未找到与约束contractname Microsoft.VisualStudio.Utilities.IContentTypeRegistryService

    今天突然停电,vs重启的时候就出现了问题,最开始是提示如图1所示的错误,开始觉得可能这提示不重要,也就关闭不在提醒了,结果,vs启动是启动了,项目也开启了,但是生成的时候,依旧就报了图1的错 图1 去 ...

  9. SDE表空间不足解决办法(ORA-01653)

    一.问题描述       在往空间数据库拷贝数据的时候,发生了ORA-01653的错误,提示信息如下: 这主要是因为表空间不足引起的,出现这种表空间不足的问题一般有两种情况:一种是表空间的自动扩展功能 ...

  10. 案例源码解读及思路:RabbitMQ在springboot中的配置

    程序员的高级之处不是什么都会,而是对自己不会的进行抽象,然后完成自己的工作.比如对于RabbitMQ,按照字面理解,就将其看成Message Queue,也就是用来容纳对象的集合.很多功能都拆分给一个 ...