Что происходит, когда я вызываю представление в MySQL с WHERE

0

У меня есть два вопроса:

Во-первых, если у меня есть простой вид в 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 является первичным ключом и индексируется, потому что индексы теряются во взглядах?

Спасибо

  • 2
    Вы смотрели план выполнения для каждого запроса?
  • 0
    Представления в MySQL - пустая трата времени.
Показать ещё 2 комментария
Теги:

1 ответ

2
Лучший ответ

Как он обрабатывает его внутренне, зависит от множества факторов, некоторые из которых документированы, некоторые таинственные, но на самом деле VIEW действует как макрос. В представлениях обычно нет индексов, но они могут использовать индексы в своих соответствующих таблицах.

Если/когда MySQL поддерживает "материализованные представления", которые похожи на предварительно вычисленные представления, это значительно меняется.

Некоторые платформы на самом деле позволяют вам INSERT в VIEW если результат будет иметь смысл.

Помните, что EXPLAIN SELECT... может рассказать вам, как MySQL понимает ваш запрос и показывает, что он собирается сделать для его запуска.

  • 0
    ОК, я пытался объяснить. Кажется, что он действительно использует индекс, если я правильно понимаю.
  • 0
    Т.е. если я произношу WHERE surname = 'Smith' в представлении, а surname индексируется в таблице people , результат EXPLAIN содержит "key = surname_idx", что, я думаю, означает, что оно используется?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню