Rafał Plewa

Rafał Plewa Manager IT,
Tourmedica.pl Sp. z
o.o.

Temat: Optymalizacja zapytania z GROUP BY i ORDER BY

Witam,

Mam pewną zagwozdkę nad którą męczę się już kilka dni. Jeśli macie jakiś pomysł byłbym wdzięćzny. Chodzi o optymalizację zapytania, które grupuje i sortuje wyniki. Oto jak wygląda sytuacja:

Jest jedna, prosta tabela `searcher` zbudowana na potrzeby szybkiej wyszukiwarki. Tabela zawiera ponad 2 miliony rekordów:

CREATE TABLE `searcher` (
`idsearcher` int(10) unsigned NOT NULL AUTO_INCREMENT,
`offer_id` int(10) unsigned NOT NULL DEFAULT '0',
`price` decimal(8,2) NOT NULL,
PRIMARY KEY (`idsearcher`),
KEY `offer_id` (`offer_id`),
KEY `price` (`price`),
KEY `offer_price` (`offer_id`,`price`)
) ENGINE=InnoDB;

Wszystkie zapytania jakie testuję działają bardzo szybko, w granicach do 0.2 sekund. Zwykłe zapytanie grupujące oferty działa błyskawicznie (korzysta z indeksu):

SELECT SQL_NO_CACHE offer_id, MIN(price) as cena_od, count(offer_id) as ilosc_terminow FROM searcher
GROUP BY offer_id
LIMIT 10

(0,005 sekundy)

Problem zaczyna się, gdy próbuję posortować wyniki po najniższej cenie w danej ofercie:

SELECT SQL_NO_CACHE offer_id, MIN(price) as cena_od, count(offer_id) as ilosc_terminow FROM searcher
GROUP BY offer_id
ORDER BY cena_od
LIMIT 10

(6,57 sekund)

Tu jak widać sytuacja pogarsza się radykalnie - prawie 7 sekund, czas niestety w moim przypadku nie do przyjęcia.

Macie jakieś pomysły?

konto usunięte

Temat: Optymalizacja zapytania z GROUP BY i ORDER BY

Rafał Plewa:
Witam,

Mam pewną zagwozdkę nad którą męczę się już kilka dni. Jeśli macie jakiś pomysł byłbym wdzięćzny. Chodzi o optymalizację zapytania, które grupuje i sortuje wyniki. Oto jak wygląda sytuacja:

Jest jedna, prosta tabela `searcher` zbudowana na potrzeby szybkiej wyszukiwarki. Tabela zawiera ponad 2 miliony rekordów:

CREATE TABLE `searcher` (
`idsearcher` int(10) unsigned NOT NULL AUTO_INCREMENT,
`offer_id` int(10) unsigned NOT NULL DEFAULT '0',
`price` decimal(8,2) NOT NULL,
PRIMARY KEY (`idsearcher`),
KEY `offer_id` (`offer_id`),
KEY `price` (`price`),
KEY `offer_price` (`offer_id`,`price`)
) ENGINE=InnoDB;

Wszystkie zapytania jakie testuję działają bardzo szybko, w granicach do 0.2 sekund. Zwykłe zapytanie grupujące oferty działa błyskawicznie (korzysta z indeksu):

SELECT SQL_NO_CACHE offer_id, MIN(price) as cena_od, count(offer_id) as ilosc_terminow FROM searcher
GROUP BY offer_id
LIMIT 10

(0,005 sekundy)

Problem zaczyna się, gdy próbuję posortować wyniki po najniższej cenie w danej ofercie:

SELECT SQL_NO_CACHE offer_id, MIN(price) as cena_od, count(offer_id) as ilosc_terminow FROM searcher
GROUP BY offer_id
ORDER BY cena_od
LIMIT 10

(6,57 sekund)

Tu jak widać sytuacja pogarsza się radykalnie - prawie 7 sekund, czas niestety w moim przypadku nie do przyjęcia.

Macie jakieś pomysły?

A co pokazuje EXPLAIN?
Wydaje mi się, że ORDERowanie może powodować ponowne wykonywanie MIN.
Może spróbuj dane nieposortowane wrzucić do tabelki tymczasowej i jak już będą gotowe to jako wynik zwrócić posortowanego SELECTa z tymczasówki?

edit: bo zakładam, że indeksy masz poprawnie pozakładane?Tomasz Fidos edytował(a) ten post dnia 20.11.10 o godzinie 08:34

Następna dyskusja:

znaki zapytania zamiast pol...




Wyślij zaproszenie do