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. Mac上安装mysqlclient的报错

    [背景] 今天我把算把自己的python基础平台从python-3.6.2升级到python-3.7.2,在我安装完python-3.7.2之后,打算在此基础之上安装 mysqlclient的时候报错 ...

  2. mac 上安装 openJDK11

    紧接上篇,mac现在基本上作为开发者的主力机,当然也要安装jdk的 首先需要卸载原来的jdk8,如下: ls /Library/Java/JavaVirtualMachines/ sudo rm -r ...

  3. Atitit s2018.5 s5 doc list on com pc.docx  Acc 112237553.docx Acc baidu netdisk.docx Acc csdn 18821766710 attilax main num.docx Atiitt put post 工具 开发工具dev tool test.docx Atiitt 腾讯图像分类相册管家.docx

    Atitit s2018.5 s5  doc list on com pc.docx  Acc  112237553.docx Acc baidu netdisk.docx Acc csdn 1882 ...

  4. How do I learn machine learning?

    https://www.quora.com/How-do-I-learn-machine-learning-1?redirected_qid=6578644   How Can I Learn X? ...

  5. 线程封装组件(BackgroundWorker)和线程(Thread)

    BackgroundWorker是微软的在.net Framwork中添加的一个组件,主要对线程的访问提供了一种安全的方式.简单的说就是对Thread的一次封装. BackgroundWorker位于 ...

  6. js快速排序算法

    真正的快速排序算法一: function quickSort(array){ function sort(prev, numsize){ var nonius = prev; var j = nums ...

  7. [转]spring MultipartFile 转 File

    原文地址:https://www.jianshu.com/p/6cf99d39e170 File.createTempFile(String prefix, String suffix); 创建一个临 ...

  8. Unity图集打包

    http://www.xuanyusong.com/archives/3304 http://www.xuanyusong.com/archives/3315 http://www.xuanyuson ...

  9. java生成zip压缩文件,解压缩文件

    1.生成zip public static void main(String[] args) { try { // testZip("c:\\temp.txt", "c: ...

  10. Bash script set help function

    set -o nounset help() { cat <<- EOF Desc: execute f1x for each case in Codeflaws Usage: ./exec ...