程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MYSQL入門知識 >> Mysql 5.7 的‘虛擬列’是做什麼?

Mysql 5.7 的‘虛擬列’是做什麼?

編輯:MYSQL入門知識
 

Mysql 5.7 中推出了一個非常實用的功能

虛擬列 Generated (Virtual) Columns

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

假設有一個表,其中包含一個 date 類型的列
`SimpleDate` date

SimpleDate 是一個常用的查詢字段,並需要對其執行日期函數,例如
SELECT ... WHERE dayofweek(SimpleDate) = 3 ...

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

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

SimpleDate_dayofweek 的值需要程序寫入,例如使用觸發器,在 SimpleDate 有變動時更新

這樣查詢就可以改為
SELECT ... WHERE SimpleDate_dayofweek = 3 ...

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

(1)降低了數據寫入性能

(2)增加冗余數據,占用了更多的存儲空間

(3)增加代碼維護成本

虛擬列 Generated Columns 就是用來解決這個問題的,可以增加一個可被索引的列,但實際上並不存在於數據表中

對於上面的例子,可以對 SimpleDate 創建一個虛擬列,然後對虛擬列創建索引,如
CREATE TABLE `test` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`SimpleDate` date DEFAULT NULL,

...

`SimpleDate_dayofweek` tinyint(4) GENERATED ALWAYS AS (dayofweek(SimpleDate)) VIRTUAL,

PRIMARY KEY (`id`),

KEY `SimpleDate_dayofweek` (`SimpleDate_dayofweek`),

) ENGINE=InnoDB

這樣就建好了虛擬列,此列的值不用我們計算
SELECT ... WHERE SimpleDate_dayofweek = 3 ...

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

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

虛擬列不存儲在數據行中,但虛擬列的元數據信息會存在於相關系統表中,對虛擬列的添加或者刪除只會涉及這些系統表,不會導致數據表的重建,所以效率很高

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

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved