基礎資料表會持久儲存資料列。檢視表會持久儲存查詢定義,並將其結果呈現為
類似資料表的物件。SHOW FULL TABLES 可區分兩者,而
INFORMATION_SCHEMA.TABLES.TABLE_TYPE 會回報 BASE TABLE 或 VIEW。
InnoDB 資料列格式 #
InnoDB 支援 REDUNDANT、COMPACT、DYNAMIC 和 COMPRESSED 資料列
格式。目前的預設值是 DYNAMIC。對於可變長度欄位,InnoDB 可以將較長的值
儲存在溢位頁面中,並在叢集索引記錄中保留參照。確切的行內與溢位行為取決於
資料列格式、頁面大小、欄位型別和值的長度;結構描述設計不應假設
TEXT 或 BLOB 值會在資料列內占用固定大小。
檢查資料表的實際設定:
SHOW TABLE STATUS LIKE 'orders';
SHOW CREATE TABLE orders;檢視表 #
使用穩定且明確的欄位清單建立檢視表:
CREATE VIEW active_customer_orders AS
SELECT o.id, o.customer_id, o.created_at, o.total
FROM orders AS o
WHERE o.status = 'active';檢視表預設不會儲存獨立的資料表。最佳化器可以將可合併的檢視表併入外層
查詢;當定義有所要求時,也可以將其具體化為暫存資料表,例如使用彙總、
DISTINCT 或某些衍生資料表操作時。ALGORITHM = MERGE 和
ALGORITHM = TEMPTABLE 表示偏好的方式,但檢視表定義仍必須符合所選
演算法的限制。
當每個受影響的資料列都能明確對應至一個基礎資料表時,部分檢視表可以更新。
包含彙總、GROUP BY、DISTINCT、視窗函式、集合運算或不可更新聯結的
檢視表無法更新。若檢視表的更新行為並非必要介面的一部分,請使用基礎資料表
進行寫入。
DEFINER 帳戶和 SQL SECURITY 設定會決定執行檢視表時套用誰的權限。
當檢視表向應用程式帳戶公開受限制的投影時,請同時檢查這兩項設定。
WITH CHECK OPTION 可防止透過可更新檢視表寫入後,產生該檢視表無法看見的
資料列。CASCADED 會檢查目前檢視表及其底層檢視表的條件,而 LOCAL
只檢查目前檢視表的條件:
CREATE SQL SECURITY INVOKER VIEW active_customer_orders AS
SELECT id, customer_id, created_at, total, status
FROM orders
WHERE status = 'active'
WITH CASCADED CHECK OPTION;MySQL 將檢視表定義儲存在資料字典中,並在執行檢視表時解析被參照的物件,
但結構描述變更仍可能使檢視表失效。變更相依資料表後,請使用
SHOW CREATE VIEW 和 CHECK TABLE,並安排移轉順序,確保呼叫端永遠不會
遇到不相容的定義。
MySQL 沒有原生且自動維護的具體化檢視表物件。需要預先計算時,請使用由 排程交易、變更資料管線或應用程式工作填入的基礎資料表。請明確定義重新整理 的不可分割性與資料新鮮度;交換或更新該資料表的操作,與查詢一般檢視表相比, 具有不同的一致性和中繼資料鎖定行為。
評論
在 GitHub 上閱讀或評論(發表評論需要登入)