Od pewnego czasu zaczynam mieć problem z zapytaniem, które do tej pory chodziło wydajnie ale wraz rosnącą liczbą rekordów w bazie strasznie spowolniło.
Mam tabele 'dane', która aktualnie posiada coś około 24 mln rekordów z danymi analitycznymi zebranymi ze stron naszych klientów.
Struktura tabeli wygląda następująco:
pole | typ 1. stamp | date PK 2. website_id | bigint(20) PK 3. concept_id | bigint(20) PK 4. validation_id | bigint(20) PK 5. url | varchar(500) PK 6. positive | bigint(20) 7. negative | bigint(20)
Dodatkowo na tabele nałożone są 4 indeksy + PRIMARY. Zapytanie, które chcę wykonać służy do pobrania danych analitycznych z pól positive i negative gdzie website_id = ? oraz z zakresu 7 dni. Zapytanie wygląda tak:
SELECT DATE(stamp) AS x, SUM(positive) AS positive, SUM(negative) AS negative FROM DATA FORCE INDEX(website_getAllCurrent) WHERE website_id = ? AND stamp BETWEEN ? AND ? GROUP BY stamp
Jak widać używam FORCE INDEX website_getAllCurrent, który nałożony jest na pola: website_id, stamp, positive, negative.
Przykłądowe zapytanie bez FORCE INDEX:
SELECT DATE(stamp) AS x, SUM(positive) AS positive, SUM(negative) AS negative FROM DATA WHERE website_id = 1 AND stamp BETWEEN '2014-05-06' AND '2014-05-13' GROUP BY x
Explain takiego zapytania:
'1', 'SIMPLE', 'data', 'range', 'PRIMARY,website_id,website_getAllCurrent', 'website_getAllCurrent', '11', NULL, '506142', 'Using where; Using index'
Czas wykonania: 67 sekund
Prosiłbym o pomoc jak można by było przyspieszyć takie zapytanie.