2017-01-29 3 views
0

Я хочу получить все статьи в моей базе данных, которые наиболее просматриваются в прошлый день, неделю или месяц.Альтернатива этому запросу

Вот почему я использую эти запросы (я использую результаты первого запроса для создания последнего)

SELECT guid 
FROM tracking 
WHERE date > UNIX_TIMESTAMP(NOW() - INTERVAL 1 MONTH) 
GROUP BY guid 
ORDER BY count(guid) DESC limit 1,10 

SELECT * 
FROM `items` 
WHERE `id` IN('66', '37', '42', '50', '55', '38', '41', '65', '71', '44') AND `type` = 'ddl' 
ORDER BY FIELD(id, 66, 37, 42, 50, 55, 38, 41, 65, 71, 44) 

Есть еще один способ, чтобы получить те же результаты, очень быстро? В настоящее время время ответа составляет 0,4530 мс только для 45 записей в таблице отслеживания & 36 записей в таблице элементов.

EXPLAIN

enter image description here

+0

Вы должны замените список состояния «IN» первым запросом. У вас есть индексы на 'guid' и' date', например? – jeroen

+0

да, я создал индекс для guid – LeSpotted44

+1

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

ответ

0

Предполагая, что вы хотите сохранить порядок, основанный на подсчете во втором запросе, вы можете использовать РЕГИСТРИРУЙТЕСЬ объединить два типа этого:

SELECT 
    a.* 
FROM 
    `items` a 
     INNER JOIN 
    (SELECT 
     guid, COUNT(guid) cnt 
    FROM 
     tracking 
    WHERE 
     date > UNIX_TIMESTAMP(NOW() - INTERVAL 1 MONTH) 
    GROUP BY guid 
    ORDER BY COUNT(guid) DESC 
    LIMIT 1 , 10) b ON a.`id` = b.guid 
WHERE 
    a.`type` = 'ddl' 
ORDER BY b.cnt DESC; 
+0

К сожалению, я получаю то же самое время результата (0.4710 мс) :( – LeSpotted44

+2

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

+0

Объяснение добавлено в мой вопрос :) – LeSpotted44