Будет ли сортировка действительно выполняться один раз для моего просмотра, а не каждый раз, когда я к ней обращаюсь?
Нет, нематериализованное представление (MySQL не поддерживает материализованные представления) не кэширует данные - они выполняются для каждой ссылки.
Как мне затем выбрать данные из них, убедившись, что сортировка остается такой, как я хочу, что-то вроде "SELECT * FROM v LIMIT 5"? Или мне нужно заново указывать порядок по выражению при чтении из представления (не будет ли он отбрасывать предварительную сортировку и повторять ее)?
Это яркий пример того, почему ORDER BY
никогда не следует включать в представления.
В представлении ORDER BY инкапсулирован. Это означает, что вы не можете видеть ORDER BY и, скорее всего, определите другой ORDER BY в ссылке на представление. ORDER BY не может быть передан как предикат для внутреннего запроса, поэтому база данных будет выполнять запрос, который представляет представление (включая ORDER BY). В этом:
CREATE VIEW your_view AS
SELECT * FROM YOUR_TABLE ORDER BY value2;
SELECT *
FROM your_view
ORDER BY value1;
... будет применен внешний ORDER BY - вы усугубили проблему с производительностью, а не решили ее.
ORDER BY - неизбежное зло, потому что нет другого способа гарантировать порядок. Решение Eli использовать только MySQL ALTER TABLE ... ORDER BY
стоит попробовать:
ALTER TABLE a ORDER BY value2 DESC;
... но в соответствии с документами его необходимо перезапустить после выполнения инструкций INSERT / UPDATE / DELETE.
Заключение
Будьте осторожны с использованием ORDER BY в представлениях, если вообще. Если производительность действительно является проблемой, просмотрите индексирование и рассмотрите разбиение таблиц.