MySQL 資料表與檢視表

最後更新: 2021-09-09 08:09:41 +0800 +0800
tags: Mysql | Sql | Databases
原文以英文撰寫。您正在閱讀AI翻譯版本。

基礎資料表會持久儲存資料列。檢視表會持久儲存查詢定義,並將其結果呈現為 類似資料表的物件。SHOW FULL TABLES 可區分兩者,而 INFORMATION_SCHEMA.TABLES.TABLE_TYPE 會回報 BASE TABLE 或 VIEW。

InnoDB 資料列格式 #

InnoDB 支援 REDUNDANT、COMPACT、DYNAMIC 和 COMPRESSED 資料列 格式。目前的預設值是 DYNAMIC。對於可變長度欄位,InnoDB 可以將較長的值 儲存在溢位頁面中,並在叢集索引記錄中保留參照。確切的行內與溢位行為取決於 資料列格式、頁面大小、欄位型別和值的長度;結構描述設計不應假設 TEXT 或 BLOB 值會在資料列內占用固定大小。

檢查資料表的實際設定:

sql
SHOW TABLE STATUS LIKE 'orders';
SHOW CREATE TABLE orders;

檢視表 #

使用穩定且明確的欄位清單建立檢視表:

sql
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 只檢查目前檢視表的條件:

sql
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 上閱讀或評論(發表評論需要登入)