Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: optymalizacja zapytania
Forum PHP.pl > Forum > Bazy danych > MySQL
zwierzołak
Witam,

Mam trzy tabele z danymi: `artykuly`, `artykuly_specjalne` (połączone po polu `id`) i `archiwum`. Muszę przenieść z `artykuly` do `archiwum` wszystkie rekordy, których niema w tabeli `artykuly_specjalne` i są starsze niż 2 miesiące.

Napisałem takie zapytanie:
  1. INSERT INTO `archiwum`(
  2. SELECT *
  3. FROM `artykuly`
  4. WHERE artykuly.id NOT IN (SELECT id FROM `artykuly_specjalne`)
  5. AND DATEDIFF(NOW(),artykuly.timeStamp) > 60
  6. )


dla 1000 rekordów działa to 4 minuty, trochę za długo biorąc pod uwagę, że rekordów są setki tysięcy. Jak zoptymalizować to zapytanie, żeby działało szybciej?
sebekzosw
dorobić w 2 tabelach pole w których będzie 1 OR 0 - jeżeli 0 to nie jest w archiwum, a jeżeli 1 to jest w archiwum. w ogóle pozbyć się tabeli archiwum i dodać w zapytaniach odpowiedni warunek smile.gif
mkozak
Cytat(zwierzołak @ 26.06.2010, 11:56:05 ) *
  1. INSERT INTO `archiwum`(
  2. SELECT *
  3. FROM `artykuly`
  4. WHERE artykuly.id NOT IN (SELECT id FROM `artykuly_specjalne`)
  5. AND DATEDIFF(NOW(),artykuly.timeStamp) > 60
  6. )


Zapytanie prawie dobre:

  1. INSERT INTO `archiwum`(
  2. SELECT *
  3. FROM `artykuly`
  4. WHERE artykuly.id NOT IN (SELECT id FROM `artykuly_specjalne` WHERE id = artykuly.id)
  5. AND DATEDIFF(NOW(),artykuly.timeStamp) > 60
  6. )


wtedy podzapytanie zwróci ci 1 lub 0 wyników, a nie X
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-2025 Invision Power Services, Inc.