視圖處理功能概念未最佳化:
·不能在視圖上建立索引。
·對於使用MERGE演算法處理的視圖,可以使用索引。但是,對於使用暫存資料表演算法處理的視圖,不能在其基表上利用索引提供的優點(儘管能夠在暫存資料表的產生過程中使用索引)。
在視圖的FROM子句中不能使用子查詢。未來該限制將被放寬。
存在一個一般原則,不能更改某一表並在子查詢的相同表內進行選擇。請參見I.3節,“對子查詢的限制”。
如果從表選擇了視圖並接著從視圖進行了選擇,同樣的原理也適用,如果在子查詢中從表選擇了視圖並使用MERGE演算法評估了視圖,也同樣。例如:
CREATE VIEW v1 AS
SELECT * FROM t2 WHERE EXISTS
(SELECT 1 FROM t1 WHERE t1.a = t2.a);
UPDATE t1, v2 SET t1.a = 1 WHERE t1.b = v2.b;
如果視圖是使用暫存資料表評估的,可從視圖子查詢中的表進行選擇,並仍能更改外部查詢中的表。在該情況下,視圖將被具體化,因此,你實際上不能從子查詢的表中進行選擇並“同時”更改它(這是你打算強制MySQL使用暫存資料表演算法的另一原因,其方法是在視圖定義中指定ALGORITHM = TEMPTABLE關鍵字)。
可以使用DROP TABLE或ALTER TABLE來捨棄或更改視圖定義中使用的表(它會是視圖失效),而且捨棄或更改操作不會導致警示。但在以後使用視圖時會出錯。
視圖定義是通過特定語句“凍結”的:
·如果PREPARE預先處理的語句引用了視圖,以後每次執行語句時看到的視圖內容與預先處理視圖時的內容相同。即使在語句預先處理完成之後、在執行語句之前更改了視圖定義,情況也同樣。例如:
·CREATE VIEW v AS SELECT 1;
·PREPARE s FROM 'SELECT * FROM v';
·ALTER VIEW v AS SELECT 2;
·EXECUTE s;
EXECUTE語句返回的結果是1,而不是2。