一步一個腳印,一天一道面試題。
物化視圖概念
物化視圖,顧名思義,是將一個查詢的結果預先計算并存儲為物理表的形式。這意味著,原本需要在運行時動態執行的復雜查詢,現在變成了直接從已經計算好的結果表中讀取數據,極大地提升了查詢速度。它是一種典型的“空間換時間”的策略,犧牲一定的存儲空間來換取查詢性能的顯著提升。
優點
- 自動維護:Doris自動維護物化視圖的數據,無論基礎表有新的數據導入還是刪除操作,都能確保物化視圖與基礎表的數據保持一致,無需人工干預。(方便,減少人工)
- 查詢優化:查詢時,Doris能夠自動匹配最優的物化視圖,并直接從該視圖中讀取數據,從而跳過不必要的計算步驟,加快查詢速度。
- 資源優化:通過物化視圖,可以將計算密集型的操作在數據加載時完成,減少了計算資源消耗。
建議使用場景
- 存儲占用小:這不是必須的,但由于物化視圖是需要占用存儲空間的,是“空間換時間”的典型,所以盡量使用較少的列(少于10列)。
- 復雜查詢加速:對于包含多表JOIN或復雜聚合函數的查詢,通過預計算結果,物化視圖可以提供即時的查詢反饋。
物化視圖舉例
假設有一個大型電商公司的數據庫中包含一張名為orders
的表,記錄了所有訂單信息,包括order_id
(訂單ID)、user_id
(用戶ID)、product_id
(商品ID)、order_date
(訂單日期)等字段。公司經常需要統計按天的用戶購買次數(用戶活躍度UV)和商品瀏覽次數(頁面訪問量PV)。
為了加速這類固定維度的聚合查詢,可以創建一個物化視圖。例如,創建一個物化視圖daily_uv_pv
,預先計算每天每個用戶的購買次數和每個商品的瀏覽次數:
CREATE MATERIALIZED VIEW daily_uv_pv
AS
SELECT user_id, product_id, DATE(order_date) AS order_day,COUNT(DISTINCT order_id) AS user_activity_count, -- UV計數COUNT(order_id) AS product_view_count -- PV計數
FROM orders
GROUP BY user_id, product_id, DATE(order_date);
這樣,當業務方需要查詢特定日期的用戶活躍度或商品瀏覽量時,可以直接從daily_uv_pv
物化視圖中快速獲取結果,而不需要每次查詢時都去掃描和匯總龐大的原始訂單表,大大提高了查詢效率。同時,Doris系統會自動管理物化視圖的數據同步,確保數據的時效性和準確性。
我是近未來,祝你變得更強!