2015-11-09 4 views
1

У меня есть база данных mysql с около 60 миллионами записей. я буду генерировать отчет каждый день.Какой SQL лучше всего использовать

У меня есть два типа операторов sql.

Method1

SELECT TransferStatus as Transfer_Status, count(ID) as Count 
FROM calldetails 
WHERE YEAR(IVRStartTime) = '2015' AND MONTH(IVRStartTime) = '11' AND DAy(IVRStartTime)='05' AND CallTransfer LIKE '163%' 
GROUP BY TransferStatus; 

Method2

SELECT TransferStatus as Transfer_Status, 
count(ID) as Count FROM calldetails 
WHERE (IVRStartTime BETWEEN '2015-11-05 00.00.00' AND '2015-11-05 23.59.59') 
AND CallTransfer LIKE '163%' 
GROUP BY TransferStatus 

Я попробовал оба запроса и занимает около 15 минут, чтобы дать результаты. Мой вопрос в том, какой из них лучше всего использовать, и есть ли другой способ повысить производительность.

+2

подсказки: создать соответствующий индекс. –

+3

Первый не поддается. Поэтому, даже если вы добавите индекс в столбец даты, он все равно будет медленным. См. Это http://stackoverflow.com/questions/799584/what-makes-a-sql-statement-sargable – thepirat000

+0

Почему закрыт? Это не основано на мнениях, а основано на фактах. Голосование для повторного открытия. –

ответ

2

использование BETWEEN лучший подход

SELECT TransferStatus as Transfer_Status, 
count(ID) as Count FROM calldetails 
WHERE (IVRStartTime BETWEEN '2015-11-05 00.00.00' AND '2015-11-05 23.59.59') 
AND CallTransfer LIKE '163%' 
GROUP BY TransferStatus 

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

или использовать index всегда быть хорошей привычкой, потому что: -

база данных, index - это структура данных, которая improvesspeed операций в таблице. Индексы могут быть созданы с использованием одного или нескольких столбцов, что обеспечивает основу для быстрого поиска в случайном порядке и efficientordering доступа к записям.

+0

Tnx. Я создал индекс и протестировал оба оператора sql. Это хорошо работает, требуется около 2 минут, когда другие принимают около 10 минут, чтобы дать результаты. –

3

Просто используйте функцию DATE, чтобы вернуть часть даты вашего значения даты и время

SELECT TransferStatus as Transfer_Status, 
count(ID) as Count FROM calldetails 
WHERE DATE(IVRStartTime) = DATE('2015-11-05') 
AND CallTransfer LIKE '163%' 
GROUP BY TransferStatus 

Это будет более эффективным для обработки состояния даты.

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

+0

№ 'DATE (IVRStartTime)' не поддается движению, поэтому он не будет использовать индекс в 'IVRStartTime'. –

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