Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [mysql] optymalizacja kodu
crocodillo
post 12.02.2012, 20:01:58
Post #1





Grupa: Zarejestrowani
Postów: 215
Pomógł: 44
Dołączył: 31.07.2011
Skąd: wrocław

Ostrzeżenie: (0%)
-----


Witam.

Mam taką funkcję:

  1. function n() {
  2. $n=sql::go(sprintf('SELECT * FROM
  3. (SELECT id as i1, latitude as x1, longitude as y1 FROM %1$s) as t1,
  4. (SELECT id as i2, latitude as x2, longitude as y2 FROM %1$s) as t2
  5. WHERE i1<i2 AND
  6. i1 NOT IN (SELECT id1 from %2$s WHERE id1 = i1 AND id2 = i2)
  7. LIMIT 3000',self::$tab_places,self::$tab_places_distance));
  8. echo '<pre>';
  9. if ($n) {
  10. while ($a=mysql_fetch_assoc($n)) {
  11. $ar=array(
  12. 'id1' => $a['i1'],
  13. 'id2' => $a['i2'],
  14. 'distance' => round(self::distanceFromCoords($a['x1'],$a['y1'],$a['x2'],$a['y2'])*1000)
  15. );
  16. print "$a[i1] - $a[i2] : $ar[distance]".PHP_EOL;
  17. sql::insertArr(self::$tab_places_distance,$ar);
  18. }
  19. }
  20. }


Nie będę tłumaczył wszystkiego, osoby znające się zrozumieją na pewno (po nazwach funkcji wiadomo o co chodzi).

Chodzi o to, że w jednej tabeli mam miejscowości wraz ze współrzędnymi geograficznymi, a w drugiej odległości między miejscowościami. W ten sposób jak ja to rozwiązałem to strasznie wolno chodzi (obecnie w bazie jest ok 1000 miejscowości). Co prawda obliczam tylko raz, ew. aktualizacja w przyszłości po dodaniu nowych miejscowości, ale tak z ciekawości chciałbym was zapytać, czy widzicie jakieś lepsze rozwiązanie?

Tak jak mam w przykładzie dla LIMIT 3000 u mnie na laptopie funkcja wykonuje się ponad 15 sekund. Kiedyś to zrobiłem bardziej w php, przeleciałem całą tabelę w pętlach, ale dzięki temu sposobowi łatwiej mi jest dodawać nowe miejscowości.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 04:48