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, чтобы они могли выполнять запросы?

Или они получают доступ через веб-сервис или тому подобное?

В любом случае, я бы адаптировал уровень данных таким образом, чтобы клиент мог варьировать в зависимости от заказа, чтобы повысить производительность для клиента.

Другие вопросы по тегам