Taki oto skrypt php:

  1. <?php
  2.  
  3. //LECIMY PRZEZ ULUBIONE KATEGORIE UZYTKOWNIKA
  4. $zapytanie_o_ulubione = mysql_query(&#092;"
  5.  SELECT 
  6. w.id_bazy id_bazy,
  7. w.priorytet priorytet,
  8. w.widoczne widoczne,
  9. w.nazwa nazwa,
  10. b.odleglosc odleglosc
  11.  FROM mobilne_wybrane w
  12.  LEFT JOIN mobilne_bazy b ON (b.id=w.id_bazy)
  13.  WHERE w.id_uzytkownika='$UZYTKOWNIK'
  14. &#092;");
  15. while ($ulubiona = mysql_fetch_array($zapytanie_o_ulubione))
  16. {
  17.  //LECIMY PRZEZ PUNKTY
  18.  $zapytanie_o_punkty = mysql_query(&#092;"
  19. SELECT * FROM mobilne_punkty p
  20. WHERE id_bazy='$ulubiona[id_bazy]'
  21.  &#092;");
  22.  while ($punkt = mysql_fetch_array($zapytanie_o_punkty))
  23.  {
  24. //CZY JUŻ JEST TAKI PUNKT W PLIKU W POBLIŻU?
  25. $wynik = mysql_query(&#092;"
  26.  SELECT id FROM mobilne_tmp_punkty
  27.  WHERE id_uzytkownika='$UZYTKOWNIK'
  28.  AND nazwa_kategorii='$ulubiona[nazwa]'
  29.  AND sqrt(
  30. pow( (x1+(x2*256)+(x3*256*256))
  31. - ('$punkt[x1]'+('$punkt[x2]'*256)+('$punkt[x3]'*256*256)) , 2 )
  32. + pow( (y1+(y2*256)+(y3*256*256))
  33. - ('$punkt[y1]'+('$punkt[y2]'*256)+('$punkt[y3]'*256*256)) , 2 )
  34. ) < '$ulubiona[odleglosc]'
  35. &#092;");
  36. //JEŚLI NIE, TO TRZEBA DODAĆ
  37. if (!mysql_fetch_array($wynik))
  38. {
  39.  mysql_query(&#092;"
  40. INSERT INTO mobilne_tmp_punkty
  41. (id_uzytkownika, x1, x2, x3, y1, y2, y3, 
  42.  priorytet, nazwa, opis, widok, numer_kategorii, nazwa_kategorii, operacja)
  43. VALUES
  44. ('$UZYTKOWNIK', '$punkt[x1]', '$punkt[x2]', '$punkt[x3]',
  45.  '$punkt[y1]', '$punkt[y2]', '$punkt[y3]',
  46.  '$ulubiona[priorytet]'-1, '$punkt[nazwa]', '$punkt[opis]',
  47.  '$ulubiona[widoczne]'-1, '$numer_kategorii', '$ulubiona[nazwa]', 2)
  48.  &#092;");
  49.  }
  50. }
  51.  }
  52. ?>


Działa na tabelach:

  1. CREATE TABLE `mobilne_bazy` (
  2. `id` mediumint(1) NOT NULL AUTO_INCREMENT,
  3. `kategoria` char(32) NOT NULL DEFAULT '',
  4. `nazwa` char(100) DEFAULT '0',
  5. `id_ikony` mediumint(1) UNSIGNED NOT NULL DEFAULT '0',
  6. `id_uzytkownika` mediumint(1) UNSIGNED NOT NULL DEFAULT '0',
  7. `data_utworzenia` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  8. `prywatna` char(1) NOT NULL DEFAULT 'N',
  9. `odleglosc` smallint(1) UNSIGNED NOT NULL DEFAULT '100',
  10. `data_aktualizacji` datetime DEFAULT NULL,
  11. PRIMARY KEY (`id`)
  12. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=100 ;
  13.  
  14. CREATE TABLE `mobilne_punkty` (
  15. `id` mediumint(1) UNSIGNED NOT NULL AUTO_INCREMENT,
  16. `id_bazy` mediumint(1) UNSIGNED NOT NULL DEFAULT '0',
  17. `id_uzytkownika` mediumint(1) UNSIGNED NOT NULL DEFAULT '0',
  18. `data` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  19. `x1` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  20. `x2` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  21. `x3` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  22. `y1` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  23. `y2` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  24. `y3` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  25. `nazwa` char(64) DEFAULT NULL,
  26. `opis` char(255) DEFAULT NULL,
  27. `niewazny` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  28. KEY `id` (`id`)
  29. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=4950 ;
  30.  
  31. CREATE TABLE `mobilne_tmp_punkty` (
  32. `id` mediumint(1) UNSIGNED NOT NULL AUTO_INCREMENT,
  33. `id_uzytkownika` mediumint(1) UNSIGNED NOT NULL DEFAULT '0',
  34. `x1` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  35. `x2` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  36. `x3` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  37. `y1` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  38. `y2` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  39. `y3` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  40. `priorytet` tinyint(4) UNSIGNED DEFAULT '0',
  41. `nazwa` varchar(64) DEFAULT NULL,
  42. `opis` varchar(255) DEFAULT NULL,
  43. `widok` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  44. `numer_kategorii` tinyint(1) UNSIGNED DEFAULT NULL,
  45. `nazwa_kategorii` varchar(32) DEFAULT NULL,
  46. `operacja` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  47. PRIMARY KEY (`id`)
  48. ) ENGINE=HEAP DEFAULT CHARSET=latin2 AUTO_INCREMENT=104844 ;
  49.  
  50. CREATE TABLE `mobilne_uzytkownicy` (
  51. `id` mediumint(1) UNSIGNED NOT NULL AUTO_INCREMENT,
  52. `login` char(64) NOT NULL DEFAULT '',
  53. `haslo` char(42) NOT NULL DEFAULT '',
  54. `mail` char(255) NOT NULL DEFAULT '',
  55. `string` char(50) DEFAULT NULL,
  56. `ilosc_na_stronie` smallint(1) UNSIGNED DEFAULT '15',
  57. UNIQUE KEY `id` (`id`)
  58. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=625 ;
  59.  
  60. CREATE TABLE `mobilne_wybrane` (
  61. `id_bazy` mediumint(1) UNSIGNED NOT NULL DEFAULT '0',
  62. `id_uzytkownika` mediumint(1) UNSIGNED NOT NULL DEFAULT '0',
  63. `priorytet` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  64. `widoczne` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  65. `nazwa` char(32) NOT NULL DEFAULT ''
  66. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;


Ale niestety na bazie zawierającej odpowiednio rekordów:
mobilne_bazy - 72
mobilne_punkty - 2 577
mobilne_tmp_punkty - 7 172
mobilne_uzytkownicy - 526
mobilne_wybrane - 709

Wykonanie skryptu trwa wiecznie. W najlepszym przypadku kończy się po prawie minucie.

Moje pytania:
1. Jak trzy zapytania sklecić do jednego i czy to coś da?
2. Jak zbudować indeksy na bazie?

Udało mi się powyższe trzy zapytania zmieścić do dwóch:
  1. SELECT
  2. p.id id,
  3. p.id_bazy id_bazy,
  4. p.x1 x1, p.x2 x2, p.x3 x3,
  5. p.y1 y1, p.y2 y2, p.y3 y3,
  6. p.nazwa nazwa,
  7. p.opis opis,
  8. w.nazwa nazwa_kategorii,
  9. w.priorytet priorytet,
  10. w.widoczne widoczne,
  11. b.odleglosc odleglosc
  12. FROM mobilne_wybrane w
  13. LEFT JOIN mobilne_punkty p ON (p.niewazny<3 AND p.id_bazy=w.id_bazy)
  14. LEFT JOIN mobilne_bazy b ON (b.id=w.id_bazy)
  15. WHERE w.id_uzytkownika='$UZYTKOWNIK'

i
  1. SELECT id
  2. FROM mobilne_tmp_punkty WHERE id_uzytkownika='$UZYTKOWNIK' AND nazwa_kategorii='$punkt[nazwa_kategorii]' AND sqrt(
  3. pow( (x1+(x2*256)+(x3*256*256))
  4. - ('$punkt[x1]'+('$punkt[x2]'*256)+('$punkt[x3]'*256*256)) , 2 )
  5. + pow( (y1+(y2*256)+(y3*256*256))
  6. - ('$punkt[y1]'+('$punkt[y2]'*256)+('$punkt[y3]'*256*256)) , 2 )
  7. ) < '$punkt[odleglosc]'


Niestety ale zmniejszyło to tylko czas wykonywania skryptu może o kilka sekund.