2012-10-11 43 views
2

我試圖找出更多關於MySQL視圖的,我還是很困惑(特別是關於細節)與WHERE

如果我得到它的正確的功能視圖的中,視圖是nothng不止一個存儲的SELECT查詢被使用。但是我的問題開始,當我想在VIEW中使用WHERE子句的某些值時。

讓我們假設,我們有這樣的觀點:

SELECT `user`.`id`, `userrole`.`key` AS `role`, `userstatus`.`key` AS `status` 
FROM `user` 
LEFT JOIN `userrole` 
ON `userrole`.`id` = `user`.`userrole_id` 
LEFT JOIN `userstatus` 
ON `userstatus`.`id` = `user`.`userstatus_id` 

現在,這將提供所有用戶的列表,以他們目前的角色/狀態現在

+----+-------+--------+ 
| id | role | status | 
+----+-------+--------+ 
| 1 | admin | active | 
| 2 | user | active | 
| 3 | user | active | 
| 4 | admin | active | 
| .. | ... | ... | 
+----+-------+--------+ 

,我只是想知道與ID 3的用戶的角色/狀態 - 所以我必須做對VIEW附加SELECT,與WHERE id = 3,對不對?但是如果我這樣做,到底會發生什麼?

請問VIEW還是SELECT的所有用戶,然後整個數據都會掉線,只有id = 3會顯示?或者它會被優化,以便VIEW只選擇user.id = 3

我感到困惑的這一性能方面 - 因爲如果我有100萬個用戶,使用這個VIEW將是一個相當糟糕的主意。但另一方面,如果我有這個VIEW,我每次都會用自己的整個SELECT以及所有的JOIN

那麼究竟怎樣的VIEW行爲?作爲簡單的SUBQUERY,還是更加優化,如果您在選擇VIEW時添加WHERE

我猜如果它的行爲像一個子查詢,一個STORED PROCEDURE參數總是會比VIEW好,那麼(如果你有WHERE參數不同)?

感謝您的信息

回答

2

將得到優化。

你可以把視圖作爲宏或別名。在運行時,當您使用視圖時,視圖的整個SQL文本會擴展到使用該視圖的查詢中。然後,查詢優化器僅挑選組合查詢中實際使用的那些列和行。

如果鍵入

SELECT `id`, `role` FROM YourView 
WHERE `status` = 4 

將擴大到

SELECT `id`, `role` FROM 
(
SELECT `user`.`id`, `userrole`.`key` AS `role`, `userstatus`.`key` AS `status` 
FROM `user` 
LEFT JOIN `userrole` 
ON `userrole`.`id` = `user`.`userrole_id` 
LEFT JOIN `userstatus` 
ON `userstatus`.`id` = `user`.`userstatus_id` 
) 
WHERE `status` = 4 
+0

非常感謝,我希望它會是這樣的! – Katai