У меня есть два вопроса:
Во-первых, если у меня есть простой вид в MySQL:
CREATE VIEW 'peopleView' AS
SELECT id, name, surname FROM people
И затем я выполняю следующий запрос:
SELECT * FROM peopleView WHERE id = 5
Создает ли сервер MySQL что-то подобное в фоновом режиме?
SELECT id, name, surname FROM people WHERE id = 5
Другими словами, он не выполняет вначале представление, которое, возможно, возвращает 5000 записей, а затем на тех 5000 записях он пытается отфильтровать WHERE id = 5? Это сделало бы представление действительно медленным...
Во-вторых, я считаю, что взгляды не имеют индексов. Поэтому, даже если surname
была проиндексирована, и я выполняю
SELECT * FROM peopleView WHERE surname = 'Smith'
Будет ли запрос по-прежнему проходить через каждую запись, чтобы найти все "Смиты", даже если Surname
индексируется, потому что представление теряет все индексы? То же самое с первичными ключами? Если id
является первичным ключом,
SELECT * FROM peopleView WHERE id = 563
должны проходить все записи, даже если id
является первичным ключом и индексируется, потому что индексы теряются во взглядах?
Спасибо
Как он обрабатывает его внутренне, зависит от множества факторов, некоторые из которых документированы, некоторые таинственные, но на самом деле VIEW
действует как макрос. В представлениях обычно нет индексов, но они могут использовать индексы в своих соответствующих таблицах.
Если/когда MySQL поддерживает "материализованные представления", которые похожи на предварительно вычисленные представления, это значительно меняется.
Некоторые платформы на самом деле позволяют вам INSERT
в VIEW
если результат будет иметь смысл.
Помните, что EXPLAIN SELECT...
может рассказать вам, как MySQL понимает ваш запрос и показывает, что он собирается сделать для его запуска.
surname
индексируется в таблице people
, результат EXPLAIN содержит "key = surname_idx", что, я думаю, означает, что оно используется?