MySQL 5.7 虛擬列 mysql 索引 virtual 區域性變數
阿新 • • 發佈:2022-04-21
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