1. 程式人生 > 其它 >MySQL 5.7 虛擬列 mysql 索引 virtual 區域性變數

MySQL 5.7 虛擬列 mysql 索引 virtual 區域性變數

MySQL 5.7 開始支援了一個新特性 虛擬列(Generated columns , 又稱生成列 / 計算列),該列的值是通過在列定義時包含的一個計算表示式得到的。 ALTER TABLE 表名稱 add column 虛擬列名稱 虛擬列型別 [GENERATED ALWAYS] as (表示式) [VIRTUAL | STORED]; MySQL 在處理 虛擬列儲存問題的時候有兩種方式:  
  • VIRTUAL(預設):不儲存列值,在讀取表的時候自動計算並返回,不消耗任何儲存,這種儲存方式僅 InnoDB 支援設定索引。
  • STORED:在插入或更新時計算儲存列值,儲存的虛擬列需要儲存空間,並且 MyISAM 也可以設定索引。

 

虛擬列注意  
  • 如果定義的虛擬列型別和表示式返回的不同,則會進行隱式的強制轉換
  • 如果對虛擬列進行顯示的寫操作,唯一允許的值是
  • DEFAULT
  • VIRTUAL 每次讀表都會計算,但可以使用索引來儲存計算值,如果剛好使用到覆蓋索引,則不會計算。

 

虛擬列允許  
  • 允許在一個表中混合使用虛擬列和儲存列
  • 允許按虛擬列分割槽
  • 允許使用為本、確定性的內建函式(每次輸出的值一樣,反向例子: )和運算子
  • NOW()
  • 虛擬列定義可以引用其他虛擬列,但只能引用表中定義較早出現的列。
  • 虛擬列允許修改表示式,但不允許修改儲存方式(只能通過刪除重新建立來修改)。
  • 可以將 STORED 虛擬列與普通列可以互相轉化,但 VIRTUAL 不行。

 

虛擬列不允許  
  • 不允許儲存函式可載入函式
  • 不允許儲存過程或函式引數
  • 不允許使用變數(系統變數、使用者定義變數、區域性變數)
  • 不允許子查詢
  • 虛擬列定義不允許使用自增 (AUTO_INCREMENT),也不允許使用自增基列
  • 外來鍵約束不能引用虛擬列
  • 觸發器不能使用或引用虛擬列
  • 被虛擬列引用的基列不允許使用外來鍵約束、AS 或引用操作

 

虛擬列用途  
  • 虛擬列可以簡化和統一查詢,將複雜條件定義為生成的列,可以在查詢時直接使用虛擬列(代替檢視)
  • 儲存虛擬列可以用作例項化快取,以用於動態計算成本高昂的複雜條件
  • 虛擬列可以模擬功能索引,並且可以使用索引,這對與無法直接使用索引的列(JSON 列)非常有用。
如果虛擬列用作索引,會有一個缺點值會儲存兩次。一次用作虛擬列的值,一次用作索引中的值。   虛擬列部分參考:  
  • https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html
  • https://sq.qoot.cool