MySQL5 7 虛擬列實現表示式或函式索引

2021-09-07 13:12:43 字數 3954 閱讀 8615

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);

可以用來做函式索引,也可稱為表示式索引,也就是基於欄位以特定函式(表示式)建立索引來提公升查詢效能之需。函式索引的優勢在於更加精確的獲取所需要的資料。

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:

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提供了乙個新的特性,虛擬...