Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: optymalizacja zapytania
Forum PHP.pl > Forum > Bazy danych > MySQL
axxxon
Witam!
w swoim skrypcie wykorzystuje 2 tabele

pierwsza zawiera pole fetched i około 120 tysięcy rekordów, druga pole addons i parę milionów rekordów.

Obecnie zapytanie w phpie generuje w taki sposob
  1. $fetch_a=mysql_query("Select fetched from first_t");
  2. $ar=array();
  3. while($r=mysql_fetch_row($fetch_a))
  4. {
  5. $ar=$r[0];
  6. }
  7. $ar=implode("','",$ar);
  8. $s=mysql_query("Select addons,inne_pola from second_t where addons not in('$ar')");

Jak widać sprawdzam czy pole addons z danego rekordu znajduje się wśród pol z kolumny fetched z tabeli pierwszej.
Jak sam widzę, nie jest to optymalne rozwiązanie, a samo zapytanie waży 6MB(!).
Zależy mi na tym aby skrypt zużywał jak najmniej pamięci, stad moja prosba.

Dodam tylko ze zapytanie typu
  1. SELECT addons,inne_pola FROM second_t s JOIN first_t f ON s.pole=f.pole2 WHERE addons NOT IN(f.fetched)

Kompletnie zawiesza mi serwer

Dzięki za wszelka pomoc:)
Noidea
Spróbuj czegoś w rodzaju:
  1. SELECT s.addons, s.inne_pola
  2. FROM second_t s
  3. LEFT JOIN first_t f ON ( s.addons = f.fetched )
  4. WHERE f.fetched IS NULL

(pisane z palca, więc mogą być błędy - chodzi mi tylko o zamysł)

Upewnij się też, że masz indeksy na addons i fetched i że są używane ( http://blog.ksiazek.info/2010/04/09/benchmark-i-profiling/ )
axxxon
Dzięki,
jednak twoje rozwiązanie nie może być w mojej sytuacji pomocne, pola w drugiej tabeli nie są puste ani tez unikalne, a co do indeksów mam je już założone na pewno...
nospor
  1. SELECT addons,inne_pola FROM second_t WHERE addons NOT IN (SELECT fetched FROM first_t)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.