Mysql 5 7 的 虛擬列 是做什麼?

2021-07-16 17:49:30 字數 1570 閱讀 1853

mysql 5.7 中推出了乙個非常實用的功能

虛擬列 generated (virtual) columns

對於它的用途,我們通過乙個場景來說明

假設有乙個表,其中包含乙個 date 型別的列

`******date` date
******date 是乙個常用的查詢字段,並需要對其執行日期函式,例如

select..

.where dayofweek(******date)=3

...

此時的問題是 即使對 ******date 建立索引,這個查詢語句也無法使用,因為日期函式阻止了索引

為了提高查詢效率,通常要進行額外的操作,例如新建乙個字段 ******date_dayofweek,存放 dayofweek(******date) 的計算結果,然後對這列建立索引

******date_dayofweek 的值需要程式寫入,例如使用觸發器,在 ******date 有變動時更新

這樣查詢就可以改為

select..

.where ******date_dayofweek =3.

..

這麼做的好處是提高了查詢效能,可以使用 ******date_dayofweek 列的索引了,但又帶來了其他麻煩,例如

(1)降低了資料寫入效能

(2)增加冗餘資料,占用了更多的儲存空間

(3)增加**維護成本

虛擬列 generated columns 就是用來解決這個問題的,可以增加乙個可被索引的列,但實際上並不存在於資料表中

對於上面的例子,可以對 ******date 建立乙個虛擬列,然後對虛擬列建立索引,如

create

table

`test`

(`id`

int(11)

notnull auto_increment,

`******date` date default

null,.

..`******date_dayofweek`

tinyint(4

) generated always as

(dayofweek(******date)

) virtual,

primary

key(

`id`),

key`******date_dayofweek`

(`******date_dayofweek`),

)engine

=innodb

這樣就建好了虛擬列,此列的值不用我們計算

select..

.where ******date_dayofweek =3.

..

查詢語句可以正常使用索引

通過虛擬列的方式,即滿足了查詢效能,也不會有之前那個解決方案的潛在麻煩

虛擬列不儲存在資料行中,但虛擬列的元資料資訊會存在於相關系統表中,對虛擬列的新增或者刪除只會涉及這些系統表,不會導致資料表的重建,所以效率很高

需要注意,不能建立虛擬列和真實列的聯合索引

Mysql 5 7 的 虛擬列 是做什麼?

mysql 5.7 中推出了乙個非常實用的功能 虛擬列 generated virtual columns 對於它的用途,我們通過乙個場景來說明 假設有乙個表,其中包含乙個 date 型別的列 date date date 是乙個常用的查詢字段,並需要對其執行日期函式,例如 select.where...

mysql57是什麼 關於mysql57的詳細介紹

簡介 php7 mysql57 nginx19 on ubuntu 1404 本文 前段時間php公升級到了7.0版本,據說很牛叉,比如效能較5.6提公升兩倍,記憶體占用低之類的,後來又看微博上說等到7.0.1才穩定。果不其然,很快就公升級了,最近才有時間折騰一下,在這裡做個總結。環境 1核1g主機...

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

mysql自古以來就不提供函式索引這麼複雜的功能。那怎麼在mysql裡面實現這樣的功能呢?我們先來看看函式索引的概念。函式索引,也可稱為表示式索引,也就是基於欄位以特定函式 表示式 建立索引來提公升查詢效能之需。函式索引的優勢在於更加精確的獲取所需要的資料。mysql 5.7提供了乙個新的特性,虛擬...