1. 程式人生 > >MySQL5.7 虛擬列實現表達式或函數索引

MySQL5.7 虛擬列實現表達式或函數索引

nic time ssi http partition add const .com 索引

MySQL5.7 虛擬列實現表達式或函數索引

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

可以用來做函數索引,也可稱為表達式索引,也就是基於字段以特定函數(表達式)建立索引來提升查詢性能之需。函數索引的優勢在於更加精確的獲取所需要的數據。

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 虛擬列實現表達式或函數索引