mysql5.7 虛擬列實現表示式或函式索引
語法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);
可以用來做函式索引,也可稱為表示式索引,也就是基於欄位以特定函式(表示式)建立索引來提公升查詢效能之需。函式索引的優勢在於更加精確的獲取所需要的資料。
createtable
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);
或者
createtable
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:
95rank:
24log_time:
2015-04
-0905:53:13
nickname: test
log_date:
2015-04
-09***************************
2. row ***************************
id:
3423
rank:
42log_time:
2015-04
-0902:55:38
nickname: test
log_date:
2015-04
-092 rows in
set (0.00 sec)
執行後結果集和之前的一致。
我們來看看查詢計畫,發現很好的利用了 idx_log_date 索引列。
mysql> explain select*from t1 where log_date =
'2015-04-09'\g
***************************
1. row ***************************
id:
1select_type: ******
table
: t1
partitions:
null
type: ref
possible_keys: idx_log_date
key: idx_log_date
key_len:
4ref: const
rows:
2filtered:
100.00
extra:
null
1 row in
set, 1 warning (0.00 sec)
利用到idx_log_date 索引
MySQL5 7 虛擬列實現表示式索引
mysql自古以來就不提供函式索引這麼複雜的功能。那怎麼在mysql裡面實現這樣的功能呢?我們先來看看函式索引的概念。函式索引,也可稱為表示式索引,也就是基於欄位以特定函式 表示式 建立索引來提公升查詢效能之需。函式索引的優勢在於更加精確的獲取所需要的資料。mysql 5.7提供了乙個新的特性,虛擬...
原創 MySQL5 7 虛擬列實現表示式索引
mysql自古以來就不提供函式索引這麼複雜的功能。那怎麼在mysql裡面實現這樣的功能呢?我們先來看看函式索引的概念。函式索引,也可稱為表示式索引,也就是基於欄位以特定函式 表示式 建立索引來提公升查詢效能之需。函式索引的優勢在於更加精確的獲取所需要的資料。mysql 5.7提供了乙個新的特性,虛擬...
原創 MySQL5 7 虛擬列實現表示式索引
mysql自古以來就不提供函式索引這麼複雜的功能。那怎麼在mysql裡面實現這樣的功能呢?我們先來看看函式索引的概念。函式索引,也可稱為表示式索引,也就是基於欄位以特定函式 表示式 建立索引來提公升查詢效能之需。函式索引的優勢在於更加精確的獲取所需要的資料。mysql 5.7提供了乙個新的特性,虛擬...