2013-02-14 3 views
0

первых один:MySQL - Как я могу улучшить эти запросы?

SELECT MONTH(timestamp) AS d, COUNT(*) AS c 
FROM table 
WHERE YEAR(timestamp)=2012 AND Status = 1 
GROUP BY MONTH(timestamp) 

один из вопросов, я сталкиваюсь для этого является то, что я должен выполнить несколько запросов, которые используют различные значения для Status. Есть ли способ объединить их в один? Как и в одной колонке он будет иметь все счетчики для того, когда Status=1 и еще один столбец для того, когда Status=2 и т.д.

второй один:

SELECT COUNT(*) c , MONTH(timestamp) t FROM 
(
SELECT t.adminid, timestamp 
FROM table1 t 
LEFT JOIN admins a ON a.adminID=t.adminID 
WHERE YEAR(timestamp)=2012   
GROUP BY t.adminID, DATE(Timestamp) 
ORDER BY timestamp DESC 
) AS a 
GROUP BY MONTH(timestamp) 
ORDER BY MONTH(timestamp) ASC; 

вложенный запрос, не уверен, если я могу улучшить это. Я запускаю этот файл на 2 таблицы, один имеет ~ 35 тыс. Строк и один имеет ~ 300 тыс. Строк. Это занимает около половины секунды для первой таблицы и 4-5 секунд для второго.

+0

Сколько столбцов статуса вам нужно? –

+0

для первого? 4 столбца, 1 для даты и 3 для 3 разных '' status'' Второй запрос только 2, один для подсчета и один за месяц – phz

ответ

1

Это может помочь:

Первый:

SELECT MONTH(timestamp) AS d, 
sum(case when Status=1 then 1 else 0 end) as Status1Count, 
sum(case when Status=2 then 1 else 0 end) as Status2Count, 
sum(case when Status=3 then 1 else 0 end) as Status3Count 
FROM `table` 
WHERE timestamp between '2012-01-01 00:00:00' and '2012-12-31 23:59:59' 
AND Status in (1,2,3) 
GROUP BY MONTH(timestamp); 

Второй:

Убедитесь, что есть индекс на timestamp колонке, а затем убедитесь, что вы не запускайте функции преобразования, например MONTH(timestamp) на индексированной колонке. Somthing как:

SELECT COUNT(*) c , a.m as t FROM 
(
SELECT t.adminid, timestamp, MONTH(timestamp) as m 
FROM table1 t 
LEFT JOIN admins a ON a.adminID=t.adminID 
WHERE timestamp between '2012-01-01 00:00:00' and '2012-12-31 23:59:59'   
GROUP BY t.adminID, DATE(Timestamp) 
ORDER BY timestamp DESC 
) AS a 
GROUP BY a.m 
ORDER BY a.m ASC; 

Второй один немного сложнее, так как у меня нет данных, передо мной, так что я не могу видеть путь доступа к БД!

+0

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

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