У меня есть следующая таблица, в которой хранятся изображения:

id        image        priority      client_id      some_data       some_more_data    ....
1         img_1.png        1            1          text ...        text ... 
12        img_2.png        2            3          text ...        text ... 
22        img_3.png        1            1          text ...        text ... 
....
..
Around 2,000,000 rows

Допустим, мне нужно получить изображения для клиента 1 в порядке их приоритетов. Я могу выполнить простой запрос вроде select image from images order by priority.

Поскольку задействовано большое количество строк, лучше иметь отдельную таблицу, в которой просто хранится image_id и приоритет, подобный этому

id        image_id       priority
1            1              1
2            12             2
3            22             1

Поэтому, чтобы получить тот же результат, я буду использовать простое соединение: select a.image from priorities b join images a on a.id = b.image_id order by b.priority

Какой из двух будет быстрее?

0
Varun Shridhar 1 Июн 2020 в 13:21

3 ответа

Лучший ответ

Если вам нужны изображения для client = 1, тогда запрос будет:

select i.image
from images i
where i.client_id = 1
order by i.priority;

Этот запрос может использовать индекс images(client_id, priority), и явной сортировки не потребуется.

Запрос, который вы хотите, будет:

select i.image
from priorities p join
     images i
     on p.id = i.image_id
where i.client_id = 1
order by bp.priority;

В этом запросе where использует столбцы из одной таблицы, а select - из другой таблицы. Это очень сложно оптимизировать, так что я думаю, что вы не можете обойтись, выполняя сортировку.

С этой точки зрения, лучше хранить данные в одной таблице с правильным индексом.

1
Gordon Linoff 1 Июн 2020 в 10:27

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

select image from images order by id, priority;
0
Jim Macaulay 1 Июн 2020 в 11:08

Чтобы добиться более быстрого выполнения запросов, всегда желательно иметь денормализованную таблицу со всеми данными в одном месте.

Объединения приводят к более медленному времени выполнения, поэтому создавайте две таблицы, только если вы хотите иметь лучшую схему и уменьшить избыточность данных.

0
pykam 1 Июн 2020 в 10:31