zazdrosny17
2.03.2016, 10:00:31
Witam,
Mam takie zapytanie:
$q1 = "SELECT *, ( 3959 * acos( cos( radians(" . $lat . ") ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(" . $long . ") ) + sin( radians(" . $lat . ") ) * sin( radians( lat ) ) ) ) AS distance FROM sklep HAVING distance < $km and `status`=1 and `wielkosc`=5 ORDER BY datadodania DESC Limit 5";
I teraz chciałbym je trochę odwrócić, tzn żeby najpierw sprawdzić status i wielkość, a dopiero później odległość między punktami, ale totalnie nie wiem gdzie wkleić wyżej pogrubiony tekst.
$q1 = "select * from sklep where(status=1 and wielkosc=5) ORDER BY datadodania DESC Limit 5";
Bardzo proszę o pomoc
Crozin
2.03.2016, 11:43:20
Kolejność wykonywania działań i tak będzie taka jakbyś tego chciał, tj. baza danych najpierw musi w ogóle zakwalifikować rekord do puli zwracanych (klauzura WHERE), następnie przygotuje sobie dane (klauzura SELECT) by na samym końcu jeszcze sprawdzić ostatecznie czy rekord pasje (klauzura HAVING).
Jeżeli chodzi o optymalizację to przede wszystkim możesz od razu walić małym kosztem te rekordy, są poza "kwadratowym" obszarem wyszukiwania. Wyliczasz sobie jakie są maksymalne i minimalne wartości szerokości i długości geograficznej i odrzucasz je na poziomie klauzuli WHERE. Dzięki temu nie musisz wyliczać odległości dla każdego rekordu, tylko dla małej części, która znajduje się na obszarze kwadratu opisanego na kole reprezentującym docelowe kryteria położenia geograficznego.