2010-05-03 86 views
18

我有一個約10萬用戶的表格。MySQL查看性能

第一種情況:

Create or replace view vw_users as select state, count(*) as cnt from users 

Explain select cnt from vw_users where state = 'ca' 

當我做一個解釋計劃:

explain select state, count(*) as cnt from users where state = 'ca' 

當我做了以上查詢我得到的費用爲5200

第二種情況說明計劃在第二個查詢中,我得到的成本爲100,000。

視圖中的where子句如何工作?在視圖檢索所有行之後應用where子句?我如何解決這個問題?

+2

視圖定義爲失蹤小組通過條款。 – 2010-05-03 19:54:44

+0

如果你不能使用合併算法,下面是我發現有幫助的解決方法:[對於可視視圖性能問題的解決方法](http://www.mysqlperformanceblog.com/2010/05/19/a-workaround-爲性能問題的可溫度視圖/) – landoncz 2011-07-14 15:38:14

回答

28

這是關於已被使用的view algorithm

合併算法行之有效最表的索引和諸如此類的東西 - 在不是Temptable算法不 - 在很多情況下,你的索引將只是平了完全不使用。

而且還有很多的廢話是合併不支持

MERGE不能使用,如果認爲 包含以下任何 構造:

* Aggregate functions (SUM(), MIN(), MAX(), COUNT(), and so forth) 
* DISTINCT 
* GROUP BY 
* HAVING 
* LIMIT 
* UNION or UNION ALL 
* Subquery in the select list 
* Refers only to literal values (in this case, there is no underlying table) 
+0

彼得,感謝您的意見。在我看來,我有一個數字(*)。所以我不能使用合併。現在我沒有指定任何算法類型。 那麼最好的方法是使用存儲過程而不是視圖? – vamsivanka 2010-05-03 19:29:53

+0

是的,你必須在這裏尋找存儲過程 - 或者只是一個簡單的子查詢。 – 2010-05-03 19:31:41

+0

彼得,非常感謝。 – vamsivanka 2010-05-03 19:33:56