Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [mysql] bardzo dlugie wykonywanie zapytanie
yalus
post
Post #1





Grupa: Zarejestrowani
Postów: 281
Pomógł: 0
Dołączył: 8.07.2005
Skąd: EU

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


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?


--------------------
człowiek nie sznurek wszystko wytrzyma
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
Snowak
post
Post #2





Grupa: Zarejestrowani
Postów: 78
Pomógł: 2
Dołączył: 13.12.2007

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


  1. SELECT numerTelefonu FROM a, b WHERE a.numerTelefonu = b.numerTelefonu
Go to the top of the page
+Quote Post
yalus
post
Post #3





Grupa: Zarejestrowani
Postów: 281
Pomógł: 0
Dołączył: 8.07.2005
Skąd: EU

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


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)


--------------------
człowiek nie sznurek wszystko wytrzyma
Go to the top of the page
+Quote Post
webdice
post
Post #4


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




Poczytaj sobie o iloczynie kartezjańskim, Twoje zapytanie to jedna wielka porażka. Spróbuj to zrobić za pomocą JOIN.

Ten post edytował webdicepl 24.01.2008, 14:42:58
Go to the top of the page
+Quote Post
yalus
post
Post #5





Grupa: Zarejestrowani
Postów: 281
Pomógł: 0
Dołączył: 8.07.2005
Skąd: EU

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


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


--------------------
człowiek nie sznurek wszystko wytrzyma
Go to the top of the page
+Quote Post
webdice
post
Post #6


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




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.

Ten post edytował webdicepl 24.01.2008, 16:05:08
Go to the top of the page
+Quote Post
yalus
post
Post #7





Grupa: Zarejestrowani
Postów: 281
Pomógł: 0
Dołączył: 8.07.2005
Skąd: EU

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


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


--------------------
człowiek nie sznurek wszystko wytrzyma
Go to the top of the page
+Quote Post
webdice
post
Post #8


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




Spróbowałeś przynajmniej?
Go to the top of the page
+Quote Post
yalus
post
Post #9





Grupa: Zarejestrowani
Postów: 281
Pomógł: 0
Dołączył: 8.07.2005
Skąd: EU

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


jeszcze nie


--------------------
człowiek nie sznurek wszystko wytrzyma
Go to the top of the page
+Quote Post
webdice
post
Post #10


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




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.

Ten post edytował webdicepl 24.01.2008, 20:46:19
Go to the top of the page
+Quote Post

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 Aktualny czas: 20.08.2025 - 07:58