Mysql результаты отсортированы по списку, который является уникальным для каждого пользователя
У меня есть таблица с тысячами продуктов и примерно с 50 аутентифицированными пользователями.
Все эти пользователи показывают продукты на своих собственных веб-сайтах, и им всем требуется возможность заказывать их по-разному.
Я предполагаю, что мне нужна какая-то отдельная таблица для заказов, которая содержит product_id, user_id и столбец заказа?
Как мне сделать это наиболее эффективно в MySQL, чтобы быть очень быстрым, и не замедлять, если я получаю миллионы продуктов в базе данных.
Это даже разумно сделать это в MySQL или я должен использовать какой-то другой индекс, как Solr / Lucene?
Моя таблица продуктов называется "продукты" Моя таблица пользователей называется "пользователи"
Хороший пример нужной мне функциональности - это поиск в Google, где вы можете заказать / подавить результаты, если вы вошли в систему.
редактировать: результаты продукта будут разбиты на страницы, и пользователи имеют право редактировать продукты, поэтому он не только готов
3 ответа
Ну, во-первых, если вы отображаете тысячи и в конечном итоге миллионы продуктов на странице, это будет медленно. Я предполагаю, что вы каким-то образом фильтруете их до нормального числа на странице.
В любом случае, ваше присоединение к таблице product_order будет довольно быстрым: оно выполняется по первичному ключу и константе (идентификатор пользователя), оба целых числа, и это будет быстрый поиск по индексу. Есть пара проблем, которые я вижу. Во-первых, действительно ли каждый пользователь определит заказ на миллион продуктов? Предполагая, что нет порядка = отображать последний, есть еще одна проблема:
SELECT whatever
FROM
products p
LEFT JOIN products_order o ON (
p.product_id = o.product_id
AND 1234 = o.user_id
)
WHERE p.stock > 0 -- some search criteria
ORDER BY COALESCE(o.order, 999999999) --- arbitrarily large number
LIMIT 10
ORDER BY
происходит до LIMIT
, MySQL должен присоединиться к каждой строке, а затем отсортировать это огромное соединение (hello filesort). Затем он выбрасывает 999 990 из 1 000 000 строк.
Если выясняется, что каждый продает только несколько продуктов, такой проблемы не будет: в предложении where MySQL будет только объединяться и сортировать несколько строк. Если каждый человек продает миллионы, вам, вероятно, придется сделать некоторую денормализацию, чтобы вы могли выполнить всю свою фильтрацию в products_order
, что также позволит избежать огромного количества рядов. Вам понадобится много строк в products_order
хотя, по одному для каждой комбинации (продукт, пользователь)... К сожалению, вы смотрите на боль в любом случае.
Разве вы не можете использовать таблицу, где вы будете сохранять параметры каждого пользователя. У вас есть система "индексный робот"? Таким образом, ваш SQL-запрос будет намного быстрее. И зачем возвращать 100 000 строк, если пользователь заботится только о первых 25, которые он или она выбрали в качестве ценных?
Вы должны всегда индексировать возникшие столбцы в каталоге где / order / group, чтобы повысить производительность. Однако в вашем случае это действительно зависит от структуры слоя, как клиенты получают доступ к вашей базе данных?
Непосредственно к базе данных MySQL, чтобы они могли выполнять запросы?
Или они получают доступ через веб-сервис или тому подобное?
В любом случае, я бы адаптировал уровень данных таким образом, чтобы клиент мог варьировать в зависимости от заказа, чтобы повысить производительность для клиента.