type
status
date
slug
summary
tags
category
icon
password
從
8.0.13 開始支持建立 Functional index使用方式
- 必須使用括號將表達式刮起來,用以和
columns index、column prefixes index區分
- 不能僅由列名組成,此情況應使用一般的
columns index
- 在表達式內不能使用
column prefixed,但可以透過SUBSTRING()來變相代替,但需要注意查詢條件必須使用相同的 function 和參數才能吃到 index,如下範例:
- 不能在
foreign key上使用
限制
Functional indexes是被實現為 hidden virtual generated columns (隱藏的虛擬列),此處使用同樣是 8.0 的新功能 show extended 顯示處隱藏的欄位,可以看到多了 3 個隨機字符串名稱的 index 其中後面寫上了 VIRTUAL GENERATEDFunctional indexes 被時限為虛擬列這有以下含意:- functional indexs 會記入 table 欄位的數量限制
繼承了 generated columns 的所有限制
- 允許常量、deterministic built-in functions、operators(運算子)
- 不允許 nondeterministic built-in functions ,例如:CONNECTION_ID(), CURRENT_USER(), NOW()
- 不允許
stored function和user-defined function
- 不允許
stored procedure
- 不允許使用變量 (包含
system variables,user-defined variables,stored program local variables)
- 不允許子查詢
- 不可依賴
AUTO_INCREMENT欄位
- 可以依賴 table 定義中較早出現的其他
generated columns,但不可依賴較晚出現的
- 雖然虛擬列不佔用儲存空間,但 INDEX 會占用
除了上述還有其他的限制如下:
- UNIQUE KEY 允許使用
Functional indexes。但因為primary key必須是實際儲存的列 (stored generated columns也可以),所以不允許使用虛擬列實現的Functional inedexes。
- 若要刪除的欄位有被用來建立
Functional indexes,則必須先移除 index
SPATIAL(空間)、FULLTEXT(全文)Indexes 不能使用Functional indexes
Functional indexes 可以使用在 JSON 欄位上,但必須使用正確的方式建構,例如以下方式建立將會導致失敗:失敗的原因為 JSON_UNQUOTE 返回
LONGTEXT 型態的值,這表示隱藏的虛擬列 也會被建立為相同的型態,該型態是無法建立一般索引的,只能建立為 FULLTEXT index 或 column prefixes index