2013-04-24 4 views
0

Я выбираю список продуктов из базы данных и показываю их пользователю. Я уже создал индекс для столбцов, используемых в where where, тогда тоже требуется много времени для возврата и загрузки результатов.Как мне оптимизировать этот запрос?

SELECT 
    prod_disp.pdid, prod_disp.cat_id, prod_disp.title, prod_disp.image_url, 
    prod_disp.price, prod_stat.eyeing_ids, prod_stat.eyeing_num, 
    prod_stat.listing_num, prod_stat.reviews_num, prod_stat.reviews_score 
FROM 
    products.prod_disp 
    INNER JOIN products.prod_stat ON prod_disp.pdid = prod_stat.pdid 
WHERE 
    prod_disp.active='1' AND prod_disp.cat_id='7' 
ORDER BY 
    RAND() 
LIMIT 0, 21; 
+3

Запустили ли вы EXPLAIN по этому запросу? –

+0

Предложение 'explain select ... 'поможет вам увидеть план выполнения вашего запроса. Пожалуйста, прочитайте справочное руководство: http://dev.mysql.com/doc/refman/5.0/en/explain.html – Barranka

ответ

0

Я не уверен, но я думаю, что ORDER BY RAND() приводит к MySQL внутренне поместить все данные в TempTable (который даже может быть записана на диске), а затем повторно заказать его в случайном порядке. Если это приемлемо для вас, вы можете заменить его на случайное, где на основе индексированного поля.

Вы также нужны эти индекс:

  • prod_disp (pdid, prod_disp.cat_id, активный)
  • FK: продукты (prod_stat)
1

Подсчитайте результаты.

Удалить заказ от rand().

генерировать случайное число между 0 и Count-21, позволяет называть его _rand

заменить LIMIT 0, 21; до LIMIT _rand, _rand + 21;

Смежные вопросы