Помогите мне оптимизировать запрос для случайных записей - PullRequest
1 голос
/ 31 августа 2011

В настоящее время у меня есть запрос для случайных записей, который безумно неэффективен, потому что он упорядочивает по RAND () и создает временную таблицу каждый раз, когда она вызывается.Кроме того, это означает, что он не может быть кэширован.Он также присоединен к другой таблице, которая добавляет время обработки и немного усложняет.Итак, помогите мне оптимизировать следующее:

SELECT     listings.id, listings.price, listings.seller_id, sellers.blacklisted
FROM       listings
INNER JOIN sellers ON sellers.id = listings.sellers_id
WHERE      listings.price > 100
AND        sellers.blacklisted = 0
ORDER BY   RAND()
LIMIT 4

Один из способов начать это - запустить один запрос, который возвращает COUNT () из возможных списков, затем второй запрос (или 4 других, если этобыть действительно случайным) со смещением, установленным в RAND () * COUNT.

Как бы вы подошли к этому?

1 Ответ

1 голос
/ 01 сентября 2011

Предполагается, что listings проиндексирован по идентификатору:

Если ваш идентификатор является целым числом:

SELECT     listings.id, listings.price, listings.seller_id, sellers.blacklisted
FROM       listings
INNER JOIN sellers ON sellers.id = listings.sellers_id
WHERE      listings.price > 100
AND        sellers.blacklisted = 0
AND        listings.ID LIKE CONCAT(CEIL(RAND() * 100),'%')
LIMIT 4

и если это ascii

SELECT     listings.id, listings.price, listings.seller_id, sellers.blacklisted
FROM       listings
INNER JOIN sellers ON sellers.id = listings.sellers_id
WHERE      listings.price > 100
AND        sellers.blacklisted = 0
AND        listings.ID LIKE CONCAT(CHAR(CEIL(RAND() * 100)),'%')
LIMIT 4

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

ps, пожалуйста, прости меня, если concat не может быть использован таким образом в mqsql;не совсем уверен, сработает ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...