mysql php co szybsze?

pyt Q

nie bede wiecej zasmiecal tego tematu i odpowiem Tobie krotko:
przeanalizuj co napisalem a w szczegolnosci sposob jaki je wykonuje. 'chester' napisal ze lepiej czasem wykonac selecta a pozniej delete na co odpisalem obrazowo przykladem z przykladowego programu co mialo pokazac jak bardzo wg. mnie sie mylil. Piotr Starzyński pisze:
mylisz że tak jak ty zaczynam polemikę nie przeczytawszy na co odpowiadam? LOL
z którego wynika ze lepiej wykonac selekta niz 300 selektów. brawo. wreszcie łapiesz
a, nie. dalej nie łapiesz.
otóz nie pokazalo.

odp A

przeanalizuj co napisalem a w szczegolnosci sposob jaki je wykonuje. 'chester' napisal ze lepiej czasem wykonac selecta a pozniej delete na co odpisalem obrazowo przykladem z przykladowego programu co mialo pokazac jak bardzo wg. mnie sie mylil. W odpowiedzi na tezę, że "czasami warto", dociekliwy użytkownik stwierdził, że bzdura i nigdy nie warto, popierając swoje oświadczenie stanowczym "to przecież oczywiste" i druzgocącym przykładem bezsensownego zapytania, które rzekomo miało coś wspólnego z zapytaniem przedpiścy, ale faktycznie było podobne jedynie do tych spotykanych na thedayliwtf.com. :-)
Faktycznie, mnie przekonał. ;>

odp A

Dnia 28-11- o Piotr Starzyński :
przeanalizuj co napisalem a w szczegolnosci sposob jaki je wykonuje. 'chester' napisal ze lepiej czasem wykonac selecta a pozniej delete na co odpisalem obrazowo przykladem z przykladowego programu co mialo pokazac jak bardzo wg. mnie sie mylil.
W odpowiedzi na tezę, że "czasami warto", dociekliwy użytkownik stwierdził, że bzdura i nigdy nie warto, popierając swoje oświadczenie stanowczym "to przecież oczywiste" i druzgocącym przykładem bezsensownego zapytania, które rzekomo miało coś wspólnego z zapytaniem przedpiścy, ale faktycznie było podobne jedynie do tych spotykanych na thedayliwtf.com. :-)
Faktycznie, mnie przekonał. ;
Maciej Łebkowski pisze:
Dla jasności dodam, że to, o czym pisałem jest jak najbardziej prawdziwym przykładem. Tabela z której usuwamy: tabela wyjazdów wakacyjnych i ich warunków mająca ok. 5 000 000 rekordów. Z powodów pewnych powodów tabela ta ma kilkadziesiąt kolumn i sporo danych. Jedna z tych kolum to 'hotel_id'. Tabela z hotelami ma ok. 10 000 rekordów. Oczywiście w tabeli z wyjazdami jest założony indeks na pole hotel_id. Zapytanie: DELETE FROM wyjazdy WHERE hotel_id IN (SELECT id FROM hotele WHERE costam) skillowałem je po ponad godzinie (nie zakończyło się) Późniejsze testy dały ok. 4.5 godzinny czas wykonania. Następnie na przywróciłem tabelę wyjazdy z backupu i wykonałem najpierw podzapytanie wybierające idki, a potem zrobiłem DELETE wstawiając w IN() idki -> IN(,,, i tak było ich sporo). Po ok. 6 minutach było wszystko zrobione. MySQL 5.0.x, obciążenie serwera praktycznie takie samo czyli żadne.
Czasem warto wygenerować prawdziwy przykład i sprawdzić, zanim się zacznie negować istnienie pewnych szczególnych okoliczności. Jak wstawiasz liczby w IN, to jest to lista stałych i - jak widać - lepiej baza korzysta z indeksu. Gdy w IN() jest podzapytanie (do zupełnie innej tabeli!) - to, choć tak być nie powinno, to jednak podzapytanie nie jest keszowane (cache'owane) i wykonuje się wieeeele razy. Oczywiście nie mam teraz tych danych testowych i odtwarzam z pamięci, ale właśnie z uwagi na 'dziwność' zweryfikowałem to.
Co więcej, w ogóle wydaje się, że IN() zmula niemiłosiernie gdy się nie podaje stałych. JOINy to inna historia, ale JOIN to JOIN, a IN to IN. Zresztą przy większej ilości JOINów też nierzadko szybciej jest wykonać kilka mikropodzapytań i wstawić ich wyniki jako stałe do głównego zapytania. Ja może lamer jestem, ale nie tylko moje testy wskazują że tak właśnie się dzieje. Oczywiście ma to sens przy naprawdę dużych tabelach, takich których dump jest > 1GB :-) Dla skromnych 30 000 to sobie można testować :-) Przy takich rozmiarach tabele tymczasowe są maciupkie.
chester

odp A

1) Przepraszam nie zrozumialem twojego zagadnienia - jako grupa PHP uznalem ze ktos pyta o to jak przyspieszyc stronke (i na prostym przykladzie staralem sie pokazac ze warto uzywac SQl a nie PHP aby typowe portaliki/strony dzialaly szybciej) i nie zauwazylem twojego problemu.
2) Co do twojego skryptu to : a) dziwne bo mnie IN dziala szybko przy duzych bazach - fakt nie mialem do czynienia z takim zapytaniem z naprawde ciezka baza. Jednak uwazam ze to co pokazales nie bedzie raczej uzywane w przypadku tego Pana co zadal pytanie i nadal twierdze ze dla niego odpowiedzia jest "Uzywaj SQL a nie PHP jak mozesz". b) co do twojego zapytania mam jedno ale. nie powinno sie czasem robic DELETE z takim czyms jak LIMIT ?? Jezeli ktos zalozy jakies klucze na twoja baze - lub bedzie ON DELETE (cos tam) to mozesz sobie narobic niezlych problemow. Fakt jezeli teraz to wykonuje sie dlugo to w tym przypadku wykona sie jeszcze dluzej ale taka cena za bezpieczenstwo danych. c) jest jeszcze kwestia szybkosci polaczenia - mam jeden przykry motyw gdy musze pobierac z bazy w innym miescie tabelke z wierszy i niestety polaczenie z ta baza jest na tyle liche ze dla przecietnego uzywajacego system niedopuszczalne - stad moj przyklad z mieszkaniami d) sorki za offa ale tak wyszlo - jakos nie lubie jak ktos naskakuje na mnie przez siec kiedy to ja staram sie byc mily :P

Dodaj odpowiedź

Tytuł:

Mail: (w celu weryfikacji posta)