2010-11-07 2 views
0

Я просто занимаюсь оптимизацией запросов, регистрируя медленные запросы и EXPLAIN их. Я думаю, что это ... Я не знаю точно, какие вещи я должен искать .... У меня есть запросПомогите оптимизировать простой запрос MySQL

SELECT DISTINCT 
     screenshot.id, 
     screenshot.view_count 
    FROM screenshot_udb_affect_assoc 
INNER JOIN screenshot ON id = screenshot_id 
    WHERE unit_id = 56 
    ORDER BY RAND() 
    LIMIT 0, 6; 

Глядя на этих двух элементов .... где я должен сосредоточиться на оптимизации?

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE screenshot ALL PRIMARY NULL NULL NULL 504 Using temporary; Using filesort 
1 SIMPLE screenshot_udb_affect_assoc ref screenshot_id screenshot_id 8 source_core.screenshot.id,const 3 Using index; Distinct 
+0

Какие столбцы указаны в таблице в вашем запросе? –

+0

Они из 'screenshot' – Webnet

+1

Как насчет' unit_id'? –

ответ

3

Для начала, пожалуйста, воздержитесь используя ORDER BY RAND(). Это, в частности, ухудшает производительность при большом размере таблицы. Например, даже с limit 1 он генерирует число случайных чисел, равное количеству строк, и будет выбирать самый маленький. Это может быть неэффективным, если размер таблицы большой или должен расти. Подробное обсуждение этого вопроса можно найти по адресу: http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/

Наконец, убедитесь, что ваши столбцы join проиндексированы.

+0

Я вижу его пример, и это блестяще, за исключением того, что я должен убедиться, что строки соответствуют моим конкретным критериям ..... – Webnet

+0

Под 100K records , отлично использовать 'ORDER BY RAND()' - над этим, и вы хотите начать поиск вариантов, которые лучше масштабируются. Для получения дополнительной информации [см. Эту статью] (http://www.dasprids.de/blog/2008/06/07/fetching-random-rows-of-mysql-efficiently) –

1

Try:

SELECT s.id, 
     s.view_count 
    FROM SCREENSHOT s 
    WHERE EXISTS(SELECT NULL 
        FROM SCREENSHOT_UDB_AFFECT_ASSOC x 
       WHERE x.screenshot_id = s.id) 
ORDER BY RAND() 
    LIMIT 6 

Под 100K записей, это нормально использовать ORDER BY RAND() - over that, and you want to start looking at alternatives that scale better. Для получения дополнительной информации, see this article.

+0

Я сделал это, он дает те же результаты, кроме он также имеет 'Использование где; 'перечислено в дополнение к' Использование временного; Использование filesort' – Webnet

1

Я согласен с kuriouscoder, воздерживаться от использования ORDER BY RAND(), и убедитесь, что каждый из следующих полей индексируются в одном индексе:

screenshot_udb_affect_assoc.id

screenshot.id

screenshot.unit_id

сделать это, используя такой код:

создать индекс iNDEX1 на скриншоте (ID):

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