MySQL 查看查詢效能差異
問題:
包含約100,000 個使用者的資料庫表記錄在直接查詢和使用檢視的查詢之間表現出顯著的效能差異。直接存取表的查詢的計劃成本為 5200,而存取視圖的查詢的計劃成本為 100,000。
說明:
效能差異是由用於執行視圖的演算法所引起。本範例中的視圖使用「temptable」演算法,該演算法在執行 WHERE 子句指定的過濾操作之前將基礎表中的所有行檢索到臨時表中。相較之下,直接查詢使用「合併」演算法,直接對基礎表的索引資料進行過濾操作。
視圖中的 WHERE 子句
視圖中的WHERE子句在視圖從基礎表中擷取所有行後套用。這意味著即使視圖可能是使用特定的篩選條件建立的,針對視圖的查詢中的 WHERE 子句仍然會套用於從臨時表中擷取的每一行。
解決方案
要解決此效能問題,應使用「合併」演算法建立視圖。這可以透過使用「物化視圖」選項來實現。物化視圖是視圖的預先計算的副本。它儲存在實體表中,以便針對物化視圖的查詢可以使用「合併」演算法進行篩選。
範例:
建立物化視圖使用「合併」演算法,使用以下語法:
<code class="sql">CREATE MATERIALIZED VIEW vw_users AS SELECT state, COUNT(*) AS cnt FROM users GROUP BY state;</code>
建立物化視圖後,針對它的查詢將具有更低的計劃成本和更高的效能。
以上是為什麼視圖查詢與直接表查詢相比表現出效能差異?的詳細內容。更多資訊請關注PHP中文網其他相關文章!