|
|
|
Какие индексы сделать под запрос с join или как улучшить архитектуру?
|
|||
|---|---|---|---|
|
#18+
Есть 2 таблицы: request: (Запросы/заказы) - id - product_id - shop_id - customer_id customer_name: (Имя клиента в разрезе пользователя) - customer_id - user_id - name (Нужно вывести список запросов с фильтром по shop_id, и сортировкой по имени клиента) SELECT c.name, r.* FROM request r LEFT OUTER JOIN customer_name c ON c.customer_id = r.customer_id AND c.user_id = 'yyy' WHERE c.shop_id = 'xxx' ORDER BY c.name LIMIT 20 OFFSET 20 Дак вот есть подозрение, что сервер умрет на таком запросе если будет много (миллион) строк. Даже если будет индекс на customer_name с сортировкой по name и фильтрами (user_id, curstomer_id), серверу все равно придется сначала в памяти сформировать временный результат из request (SELECT FROM request r WHERE c.shop_id = 'xxx'), а это может быть миллион строк, далее пойдет процесс "пристыковки" сортированной таблицы customer_name, и от сюда уже возьмется только 20 строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2015, 13:59 |
|
||
|
Какие индексы сделать под запрос с join или как улучшить архитектуру?
|
|||
|---|---|---|---|
|
#18+
zzox4есть подозрениеесть подозрение, что компания с миллионами заказов найдет денег нанять специалистов, способных спроектировать работающую систему. а тему то заводил для чего, поделиться подозрениями или чтобы ткнули в избыточную левость запроса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2015, 14:15 |
|
||
|
Какие индексы сделать под запрос с join или как улучшить архитектуру?
|
|||
|---|---|---|---|
|
#18+
zzox4, Скажите пожалуйста, зачем вам request r LEFT OUTER JOIN customer_name c, если вы тут же пишете WHERE c.shop_id = 'xxx' ? Проблемы будут как раз из-за этого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2015, 14:24 |
|
||
|
Какие индексы сделать под запрос с join или как улучшить архитектуру?
|
|||
|---|---|---|---|
|
#18+
p2. чтобы ткнули в избыточную левость запроса? левость тут не избыточна - таблица customer_name может быть пустой, но заказы выдать все равно нужно. p2. а тему то заводил для чего, Что-б спецы подсказали, есть ли решение лучше (этого решения "в лоб"), либо подтвердили, что sql тут "сосет". если описать задачу на пальцах - клиенты делают заказы, а сотрудники захотели именовать клиентов по своему - сотрудники именуют одних и тех же клиентов по своему (и именования других сотрудников им показывать нельзя), в результирующей таблице нужна возможность сортировать заказы по клиенту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2015, 14:31 |
|
||
|
Какие индексы сделать под запрос с join или как улучшить архитектуру?
|
|||
|---|---|---|---|
|
#18+
Скажите пожалуйста, зачем вам request r LEFT OUTER JOIN customer_name c, если вы тут же пишете WHERE c.shop_id = 'xxx' ? Проблемы будут как раз из-за этого. Упс, опечатка, нужно фильтровать заказы по магазину (WHERE r.shop_id = 'xxx'): SELECT c.name, r.* FROM request r LEFT OUTER JOIN customer_name c ON c.customer_id = r.customer_id AND c.user_id = 'yyy' WHERE r.shop_id = 'xxx' ORDER BY c.name LIMIT 20 OFFSET 20 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2015, 14:33 |
|
||
|
Какие индексы сделать под запрос с join или как улучшить архитектуру?
|
|||
|---|---|---|---|
|
#18+
В крайнем случае можно для этого держать кеш-таблицу с нужными индексами, но это не "интересно" - в этом случае psql со своими джойнами не лучше чем какой-нибудь nosql. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2015, 14:45 |
|
||
|
Какие индексы сделать под запрос с join или как улучшить архитектуру?
|
|||
|---|---|---|---|
|
#18+
zzox4, Ну строите индексы по r.shop_id, по c.customer_id, c.user_id и в путь. На нормальном железе с разумным количеством заказов (кстати, откуда у вас миллионы? Если заказ выполнен, то чего на него смотреть?) будет вполне приемлемо. Можно, конечно, сначала сделать индекс r.shop_id, r.id, r,customer_id и сначала выбирать первичные ключи заказов и поднимать их юзерские имена, сортировать их, вырезать нужный кусок и уж только потом лезть за остальными данными (т.е. за r.*). Многого вы тут не выиграете, впрочем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2015, 14:59 |
|
||
|
|

start [/forum/topic.php?fid=53&fpage=103&tid=1997702]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 327ms |

| 0 / 0 |
