Вие просто питате за две колони в заявката си, така че индексите могат/трябва да отидат там:
- Дата и час
- Време на зареждане
Друг начин за ускоряване на вашата заявка може да бъде разделяне на полето DateTime на две:дата и час.
По този начин db може да групира директно в полето за дата, вместо да изчислява ДАТА(...).
РЕДАКТИРАНО:
Ако предпочитате да използвате тригер, създайте нова колона (DATE) и я наречете newdate , и опитайте с това (не мога да го пробвам сега, за да видя дали е правилно):
CREATE TRIGGER upd_check BEFORE INSERT ON SpeedMonitor
FOR EACH ROW
BEGIN
SET NEW.newdate=DATE(NEW.DateTime);
END
РЕДАКТИРАНО ОТНОВО:
Току-що създадох db със същата таблица speedmonitor, пълна с около 900 000 записа.
След това изпълнявам заявката SELECT newdate,AVG(LoadTime) loadtime FROM speedmonitor GROUP BY newdateкод> и отне около 100 секунди!!
Премахване на индекс в полето newdate (и изчистване на кеша с помощта на НУЛИРАНЕ НА КЕШ НА ЗАЯВКАТА
и FLUSH TABLES
), същата заявка отне 0,6 секунди!!!
Само за сравнение:заявка ИЗБЕРЕТЕ ДАТА(DateTime),AVG(LoadTime) време за зареждане ОТ speedmonitor ГРУПА ПО ДАТА(DateTime)
отне 0,9 сек.
Така че предполагам, че индексът на newdate не е добър:премахнете го.
Ще добавя колкото мога повече записи сега и ще тествам отново две заявки.
ОКОНЧАТЕЛНА РЕДАКТИРАНЕ:
Премахване на индекси в колони newdate и DateTime, като има 8 милиона записа на таблицата speedmonitor, ето резултати:
- избиране и групиране по колона с нова дата:7,5 сек.
- избиране и групиране в поле DATE(DateTime):13.7s
Мисля, че това е добро ускоряване.
Отнема време за изпълнение на заявка в командния ред на mysql.