8

Mam duży stół z 22 milionami rekordów. Chcę wykonać następny zapytanie:Zapytanie MySQL według daty z dużym inwerterem

select auto_alerts from alerts_stat where endDate > "2012-12-01" 

celu zwiększenia wydajności dodałem indeks btree dla endData polu:

CREATE INDEX endDate_index USING BTREE ON alerts_stat(endDate) 

Po zacznę analizować plan wykonania kwerendy:

Kiedy chcę pobierz parametry od 15 do 7 dni wcześniej:

explain select alerts_sp from alerts_stat 
where endDate between CURDATE() - 15 and CURDATE() - 7; 

Mam następny plan wykonania, który przetworzy 2 762 088 wierszy.

'1', 'SIMPLE', 'browser_plugin_alerts_stat', 'range', 'endDate_index', 'endDate_index', '4', NULL, '2762088', 'Using where' 

Kiedy zwiększyć interwał o jeden dzień, otrzymałem:

explain select alerts_sp from alerts_stat 
where endDate between CURDATE() - 15 and CURDATE() - 6; 

wytłumaczyć powiedział Plan MySQL przetwarzać wszystkie 22,923,126 wierszy.

'1', 'SIMPLE', 'browser_plugin_alerts_stat', 'ALL', 'endDate_index', NULL, NULL, NULL, '22932390', 'Using where' 

Na przykład wybierz bez żadnych warunków w GDZIE proces 22.255.642.

Czy mogę poprawić plan wykonania? Może gdzieś się mylę, czy normalny jest MySQL?

Odpowiedz

3

Gdy zestaw wyników przekracza 8-9% wszystkich wierszy, MySQL wykonuje pełne skanowanie tabeli. Dla mnie wygląda na to, że pewnego dnia dodasz huśtawki MySQL w pełnym kierunku skanowania tabeli. Możesz spróbować wymusić indeks, aby sprawdzić, czy wynik jest lepszy.

UPDATE:

Z tego co czytałem, optymalizator zapytań MySQL ma tendencję do wyboru złego w przypadkach granicznych, takich jak ten, więc równie dobrze może to działać lepiej zmuszając indeksu. W przeciwnym razie jest to prosta kwerenda i nie mam zbyt wiele miejsca na optymalizację.

Może utworzenie Covering index na tych dwóch kolumnach i wymuszenie jej użycia może dać najlepsze wyniki.

+0

Dzięki. Pomyśl, że to moja sprawa. Jest to więc zachowanie specyficzne dla MySQL. Czy mogę w jakiś sposób poprawić zapytanie, aby uzyskać np. Sumę ("alerts_sp") dla dużych interwałów? – Taky