Как работает MySQL Views?
Вопрос
Когда я создаю представление, я в основном делающую новую таблицу, которая автоматически будет трансертирована, когда данные в одном из таблиц она объединяет изменения; это правильно?
Также почему я не могу использовать подзапросы на мой взгляд?
Решение
Просмотр работ как таблица, но это не столик. Это никогда не существует; Это только подготовленное утверждение SQL, которое выполняется, когда вы ссылаетесь на имя просмотра. IE:
CREATE VIEW foo AS
SELECT * FROM bar
SELECT * FROM foo
... эквивалентно запуску:
SELECT x.*
FROM (SELECT * FROM bar) x
MySqldumm никогда не будет содержать строки, которые будут вставлены в вид ...
Также почему я не могу использовать подзапросы на мой взгляд ????
Это, к сожалению, является (хотя и сомнительным) дизайном. Есть многочисленные ограничения для видов MySQL, которые документированы: http://dev.mysql.com/doc/refman/5.0/ruete-view.html.
Так что, если это просто воображаемая таблица / подготовленная оператор, это означает, что это теоретически имеет одинаковую производительность (или даже меньше) как обычный стол / запрос?
Нет.
Таблица может иметь индексы, связанные с индексами, которые могут сделать поиск данных быстрее (при некоторых затратах для вставки / обновления). Некоторые базы данных поддерживают «материализованные» представления, которые являются представлениями, которые могут иметь к ним индексы, которые не должны быть удивленным, что MySQL не поддерживает Учитывая функциональность ограниченного просмотра (которая только началась в V5 IIRC, очень поздно в игре).
Поскольку представление представляет собой производную таблицу, производительность представления так же хорош, как запрос, включенный. Если этот запрос отстой, проблема производительности будет просто Snowball ... что сказал, когда при запросе представления - если ссылка на столбце представления в предложении Where не попадает в функцию (т. Е. WHERE v.column LIKE ...
, нет WHERE LOWER(t.column) LIKE ...
) Оптимизатор может протолкнуть критерии (называемый предикатом) на исходный запрос - делая его быстрее.
Другие советы
Я также столкнулся с такой же проблемой (к моему удивлению, потому что мой поиск, похоже, указывает на то, что Oracle и MS поддерживают его).
Я получаю это ограничение (по крайней мере, на данный момент до доказательства не используемого) путем создания двух дополнительных просмотров для моего окончательного представления.
Пример:
CREATE VIEW Foo1 AS
SELECT * FROM t ORDER BY ID, InsertDate DESC
CREATE VIEW Foo2 AS
SELECT * FROM Foo1 GROUP BY ID
CREATE VIEW Foo AS
SELECT * FROM Foo2 ORDER BY ID
Пример выше в основном имеет таблицу «T», которая является временной таблицей, содержащей все ревизии. Мой «Foo» (вид) в основном - простой вид только на мои самые современные изменения каждой записи. Кажется, работает хорошо!
Обновлять:
Я не знаю, есть ли это еще одна ошибка в MySQL 5.1, но вышеприведенный пример на самом деле не работает! «Foo1» работает, как и ожидалось, но «Foo2», похоже, игнорирует заказ до группировки, поэтому мой конечный результат не то, что предназначен. Я даже получаю тот же результат, если я изменим «Desc» для «ASC» (удивительно).
Кроме того, если вы прочитаете 17.5.1. Просмотр синтаксиса Раздел, это четко утверждено:
«Вид может быть создан из многих видов выбора операторов. Это может относиться к базовым таблицам или другим представлениям. Он может использовать объединения, объединение и подзапросы».
Я собираюсь обновить свою базу данных до 5,6 и попробовать его снова!
Разница:
для того, чтобы посмотреть у вас могут только подзапросы в то, где - часть, не в отчасти так
CREATE VIEW v AS SELECT * FROM foo WHERE id IN (SELECT id FROM bar)
будет работать - но в то же время вы получите вид только для чтения ... простой вид на одной таблице позволит обновить «через» вид на базовую таблицу