Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] bardzo dlugie wykonywanie zapytanie
Forum PHP.pl > Forum > Przedszkole
yalus
witam

w bazie danych mam dwie tabele tabela A w ktorej jest 44tys rekordow i tabela B w ktorej jest 27tys
w kazdej tabeli znajduje sie pole o nazwie numerTelefonu
i teraz chcialbym z tabeli A usonac takie same rekordy ktore znajduja sie w tabeli B

do sprawdzenia ile takich samych rekordow znajduje sie w tabeli A i B skonstruowalem takie oto zapytanie:

  1. SELECT numerTelefonu FROM A WHERE EXISTS (SELECT B.numerTelefonu FROM B WHERE A.numerTelefonu = B.numerTelefonu)


bardzo ladnie to sie sprawdza przy malych ilosciach rekordow ale prze 44tys i 27tys zajmuje mi to wieki
system sie wiesza i trace kontrole nad kompem - musze restartowac

czy jest jakis inny sposob na to?
Snowak
  1. SELECT numerTelefonu FROM a, b WHERE a.numerTelefonu = b.numerTelefonu
yalus
a jak to sie ma do tego:

  1. SELECT * FROM A WHERE EXISTS (SELECT B.numerTelefonu FROM B WHERE A.numerTelefonu = B.numerTelefonu)


lub do tego

  1. DELETE FROM A WHERE EXISTS (SELECT B.numerTelefonu FROM B WHERE A.numerTelefonu = B.numerTelefonu)
webdice
Poczytaj sobie o iloczynie kartezjańskim, Twoje zapytanie to jedna wielka porażka. Spróbuj to zrobić za pomocą JOIN.
yalus
porazka nie porazka

pytam bo nie wiem

Cytat
Spróbuj to zrobić za pomocą JOIN.


jak bym wiedzial to bym zrobil

moze Ty bys mi pomogl
webdice
O coś takiego mi chodzi.

  1. SELECT * FROM tablea LEFT JOIN tableb ON tablea.phone = tableb.phone WHERE tableb.id IS NOT NULL


EDIT: Poczytaj sobie jeszcze o indexach.
yalus
no nie wiem ale na moje oko to chyba ni tak

chyba pozostane przy moim sposobie

btw u mnie za indeksy robia kolumny numerTelefonu jako unikalne
webdice
Spróbowałeś przynajmniej?
yalus
jeszcze nie
webdice
Nie oczekuj zbyt zbyt wiele, ale na pewno moje zapytanie będzie dużo szybsze. Jestem pewien że mógłbyś tą tabele inaczej zaprojektować i nie miałbyś takich problemów.

EDIT: Stworzyłem sobie bazę tabelaA: 50 000 rekordów, tabelaB: 30 000 rekordów, tabele były takie same (pola: id, phone). Twoje zapytanie wykonywało się powyżej minuty i przerwałem, moje 29 sekund. Po nadaniu indexu dla pola phone w tabeli tableA czas zmalał do 0.05 sekundy, a Twoje zapytanie znowu wykonywało się dość długo i taj jak wyżej również je przerwałem.
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.