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. [docker]通过阿里云源安装docker && flannel不通问题解决(try this guy out)

    docker清理容器 # 容器停止后就自动删除: docker run --rm centos /bin/echo "One"; # 杀死所有正在运行的容器: docker kil ...

  2. [moosefs] storage class

    chapter 1 moosefs 3.1 storage class 功能的介绍 1.1 什么是storage class 在moosefs中,storage class允许指定文件的chunks存 ...

  3. Android设备真实DPI与系统标示DPI——ldpi/mdpi/hdpi/xhdpi/xxhdpi/xxxhdpi

    1.设备真实DPI与系统标示DPI 2.drawable允许的标示DPI值         drawable文件的合法名称如下: 3.如何验证         Demo如下,建立不同dpi的drawa ...

  4. IDEA community + Gradle + Gretty 调试 servlet 应用 + war包部署到tomcat

    参考:https://guides.gradle.org/building-java-web-applications 1.运行和调试 IDEA创建gradle项目,项目结构如下 各个文件: buil ...

  5. Oracle sql 统计

    1.按小时统计数量 SELECT TO_CHAR(RECEIVE_TIME,'HH24') HOUR ,COUNT(*) N FROM PH_PRESCRIPTION P WHERE TO_CHAR( ...

  6. @Scope用法

    http://www.cnblogs.com/lonecloud/p/5937513.htmlhttp://www.cnblogs.com/lonecloud/p/5937513.htmlhttp:/ ...

  7. Spark RDD、DataFrame原理及操作详解

    RDD是什么? RDD (resilientdistributed dataset),指的是一个只读的,可分区的分布式数据集,这个数据集的全部或部分可以缓存在内存中,在多次计算间重用. RDD内部可以 ...

  8. HDFS基础

    1. HDFS Shell基础 [root@master hadoop]# hadoop fsUsage: hadoop fs [generic options] [-appendToFile < ...

  9. @Resource注入为null

    UserController中userService为null只有一个原因, 那就是你所使用的UserController对象没有被IoC容器所管理,你使用的对象是自己new出来的, 而不由sprin ...

  10. 配置python开发环境(Eclipse + pyDev)

    jdk-11.0.2eclipse 2018-12python 3.7.2 1. install jdk, 配置环境变量 新建JAVA_HOME 系统变量,C:\Program Files\Java\ ...