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