Используя представление, чтобы предварительно отсортировать выбор в MySQL? - PullRequest
3 голосов
/ 16 февраля 2011

У меня есть таблица a с двумя полями, скажем, value1 и value2.

Каждый отдельный выбор, который я сделаю для этой таблицы, будет отсортирован по значению DESC, но так как таблица довольно большая, я не могусделайте это «ванильно» больше из-за проблем с производительностью.

Мое решение состояло в том, чтобы создать представление v, которое в основном было чем-то вроде:

CREATE VIEW v AS SELECT * FROM a ORDER BY value2 DESC

Мои вопросы теперь:

  • Это правильный способ сделать это?Будет ли сортировка действительно выполняться один раз, на мой взгляд, а не каждый раз, когда я к ней обращаюсь?И если нет, то как мне действовать вместо этого?
  • Как мне затем выбрать данные из этого, следя за тем, чтобы сортировка оставалась такой, как я хочу, что-то вроде «SELECT * FROM v LIMIT 5»?Или мне нужно заново указывать порядок по пунктам при чтении из представления (не откажется ли оно от предварительной сортировки и переделать ее)?

Спасибо за любую помощь!

Ответы [ 3 ]

2 голосов
/ 16 февраля 2011

Будет ли сортировка действительно выполняться один раз для моего просмотра, а не каждый раз, когда я к ней обращаюсь?

Нет, нематериализованное представление (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 в представлениях, если вообще. Если производительность действительно является проблемой, просмотрите индексирование и рассмотрите разбиение таблиц.

0 голосов
/ 16 февраля 2011

Это правильный способ сделать это? Будет вид действительно будет сделано один раз для моего просматривать вместо каждого доступа это? * * 1002

нет

Нет

А если нет, как мне поступить вместо?

Начните с создания индекса на value2

Как мне тогда выбрать данные из него убедившись, что сортировка остается, как я хочу, что-то вроде "SELECT * FROM v LIMIT 5 "?

Да, если запрос не имеет собственного ORDER BY, будет использоваться ORDER BY из представления.

0 голосов
/ 16 февраля 2011

Если вы хотите, чтобы вся таблица сортировалась по "значению 2" в порядке DESC , почему бы не сделать это?

ALTER TABLE `table_name` ORDER BY `value2` DESC;
...