When I create a view I am basically making a new table that will automatically be transacted upon when data in one of the tables it joins changes; is that correct?
Also why can’t I use subqueries in my view?
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
A view works like a table, but it is not a table. It never exists; it is only a prepared SQL statement that is run when you reference the view name. IE:
…is equivalent to running:
A MySQLDump will never contain rows to be inserted into a view…
That, sadly, is by (albeit questionable) design. There’s numerous limitations for MySQL views, which are documented: http://dev.mysql.com/doc/refman/5.0/en/create-view.html
So if it’s just an imaginary table/prepared statement does that mean it theoretically has the same performance (or even less) as a normal table/query?
No.
A table can have indexes associated, which can make data retrieval faster (at some cost for insert/update). Some databases support “materialized” views, which are views that can have indexes applied to them – which shouldn’t be a surprise that MySQL doesn’t support given the limited view functionality (which only began in v5 IIRC, very late to the game).
Because a view is a derived table, the performance of the view is only as good as the query it is built on. If that query sucks, the performance issue will just snowball… That said, when querying a view – if a view column reference in the WHERE clause is not wrapped in a function (IE:
WHERE v.column LIKE ..., notWHERE LOWER(t.column) LIKE ...), the optimizer may push the criteria (called a predicate) onto the original query – making it faster.