У меня ужасное время с запросом MySQL. Я провел большую часть своих выходных и большую часть своего дня сегодня пытался сделать этот запрос немного быстрее. Я сделал это значительно быстрее, но я знаю, что смогу сделать это лучше.MySQL Query Optimization - случайная запись
SELECT m.id,other_fields,C.contacts_count FROM marketingDatabase AS m
LEFT OUTER JOIN
(SELECT COUNT(*) as contacts_count, rid
FROM contacts
WHERE status = 'Active' AND install_id = 'XXXX' GROUP BY rid) as C
ON C.rid = m.id
WHERE (RAND()*2612<50)
AND do_not_call != 'true'
AND `ACTUAL SALES VOLUME` >= '800000'
AND `ACTUAL SALES VOLUME` <= '1200000'
AND status = 'Pending'
AND install_id = 'XXXXX'
ORDER BY RAND()
У меня есть индекс «install_id», «категории» и «статус», но EXPLAIN показывает, что она разбирала на основе 9100 строк.
Моя Объяснять здесь: https://s3.amazonaws.com/jas-so-question/Screen+Shot+2012-03-13+at+12.34.04+AM.png
Кто-нибудь есть какие-либо предложения о том, что я могу сделать, чтобы сделать это немного быстрее? Вся точка запроса заключается в выборе случайной записи из записей учетной записи (install_id), которая соответствует определенным критериям, таким как объем продаж, статус и do_not_call. В настоящее время я собираю 25 записей и кеширую их (используя PHP), поэтому мне нужно запускать этот запрос только каждые 25 запросов, но я уже имею дело с тысячами запросов в день. В настоящее время он занимает 0,2 секунды. Я понимаю, что, используя ORDER BY RAND(), я уже делаю большой удар производительности, но он просто сортирует 25 строк.
Заранее благодарим за помощь.
** EDIT: Я забыл упомянуть, что индекс «contact_sort» находится в таблице «контакты» и индексирует install_id, статус и удаление. (удалить ссылки Record ID в marketingDatabase, чтобы он знал, к какой записи относится.
** EDIT 2: номер 2612 в запросе представляет количество строк в marketingDatabase, которые соответствуют критериям (install_id, статус, фактические продажи объем и т.д.)
Взгляните на http://dev.mysql.com/doc/refman/5.0/ru/group-by-optimization.html Существуют ограничения и сложности, возникающие при использовании GROUP BY и индексов. Чтобы процитировать руководство «Важнейшими предпосылками для использования индексов для GROUP BY являются то, что все столбцы GROUP BY ссылаются на атрибуты из того же индекса и что индекс сохраняет свои ключи в порядке (например, это индекс BTREE, а не HASH индекс)." Вы группируете неиндексированное поле, а также выбираете и заказываете всю таблицу в подзапросе. Я думаю (не уверен), что заказ RAND() также плохая идея. – fred2
ORDER BY RAND() - очень, очень [плохая идея] (http://www.webtrenches.com/post.cfm/avoid-rand-in-mysql). – budwiser
Да, я знаю, что это плохая идея, хотя я читал, потому что ORDER BY RAND() только заказывает 25 строк, это не так уж и важно. Я ошибаюсь? Как я могу исправить это и все равно получить случайную запись? У меня нет столбца с автоматическим приращением без пробелов ... мой столбец id является автоматическим приращением, но имеет пробелы, где строки были удалены. – user1265617