![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 504 Pomógł: 2 Dołączył: 31.03.2006 Skąd: Londyn Ostrzeżenie: (0%) ![]() ![]() |
Przypuscmy tabele...
users => user_id, password, e-mail, tel, adres, imie, nazwisko, login nazwa_samochodu => user_id, nazwa_samochodu. telewizory => user_id, marka_tv Tabele maja powiedzmy 2000 rekordow. Kazdy user ma i samochod i telewizor (utopijnie ![]() Teraz chcialbym w wierszu wyswietlic wszystkie informacjie, w nastepnym nastepnego usera i az do 2000 ![]() Slyszalem ze stosowanie LEFT/RIGHT JOIN itp na duzych tabelach jest bardzo wolne (nei wiem wszak co dla MySQL to duza tabela). Jak myslicie ? Zmiksowac to w jedna tabele czy uzyc laczenie tabel ? A moze inny sposob na ktory nie wpadlem. -------------------- "Wizja czasu jest szeroka, lecz kiedy sie przez nia przechodzi, czas staje sie waskimi drzwiami"
![]() |
|
|
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
Kazda operacja zlaczen jest wolna. LEFT JOIN jest tutaj dobrym podejsciem. Jesli chcesz naraz wyswietlic 2k rekordow to blad. Zrob porcjowanie czyli LIMIT i czas bedzie zadowalajacy. Wazne aby indeksy byly na polach zlonczen i na warunkach.
-------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 504 Pomógł: 2 Dołączył: 31.03.2006 Skąd: Londyn Ostrzeżenie: (0%) ![]() ![]() |
Propo porcojowania -> swietna mysl zupelnie zapomnialem o limicie.
Mam maly problem z LEFT JOINEM... Zapytanie skonstruowalem zgodnie z ksiazka ( nie chce reklamowac) wyglada nastepujaco:
Nie pobiera rekordow w dalszym ciagu, a ja nie moge zlokalizowac bledu. Dodam tylko ze wszelkie ORDER BY LIMIT sa w zapytaniu nie bylo sensu wypisywac bo nie dotycza pytania. Ktos moze mi pomoc z zapytaniem ? Albo nakierowac na dobre zrodlo ? Wszedzie gdzie szukalem wyjasnienie do mnie nie dociera albo podaja gotowe przyklady a gotowiec mnie nie interesuje bo chce zrozumiec. Ten post edytował thornag 12.06.2006, 15:46:11 -------------------- "Wizja czasu jest szeroka, lecz kiedy sie przez nia przechodzi, czas staje sie waskimi drzwiami"
![]() |
|
|
![]()
Post
#4
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 224 Pomógł: 40 Dołączył: 6.07.2004 Skąd: Wuppertal Ostrzeżenie: (0%) ![]() ![]() |
przenosze do mysql.
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 401 Pomógł: 5 Dołączył: 14.09.2003 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Jeżeli chodzi o samo zapytanie, to bez struktury bazy danych ciezko cos bedzie powiedziec.
A jeżeli chodzi o LIMIT to niesugerowałbym się tym rozwiązaniem, bo ono tylko ogranicza wyniki zwracane klientowi a serwer i tak musi przemielić wszystkie rekordy dlatego tez:
Jest odradzanym zabiegiem, bo serwer mysql'a i tak musi przemielić wszystkie 10010 rekordów żeby zwrócić te właściwe 10, więc zysk żaden. Lepiej to zrobić przez WHERE, np zakładając, że mamy w polu id i znamy id'k ostatnio zwróconego ostatniego rekordu to można tak:
Ten post edytował bendi 12.06.2006, 17:11:15 -------------------- |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław ![]() |
@ bendi - nie wiem, gdzie znalazłeś takie zalecenie, ale nie ma ono zbyt dużo sensu.
W ten sposób nie można zbudować poprawnego LIMIT, a bez tego nie możliwe byłoby żadne stronicowanie itp. Zresztą - w obu przypadkach baza danych może wykorzystać indexy, tak więc rożnica w wydajności nie powinna być zauważalna. @ thornag - Wszelkiego rodzaju JOIN'y rzeczywiście spowalniają zapytanie. Jednak różnica czasu wykonywania, przy poprawnie skonstruowanej bazie (z indexami oraz związkami tylko na polach liczbowych) różnica czasów staje się zauważalna dopiero przy NAPRAWDĘ dużych tabelach. NAPRAWDĘ oznacza "nieco więcej" niż 2tyś rekordów - MySQL sprawnie sobie radzi z tworzeniem związków pomiędzy tabelami z milionami rekordów. Stąd też standardem są zapytania, w których wykorzystywane jest wiele JOIN'ów równocześnie, a mimo to chodzą one bardzo sprawnie. -------------------- "Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
@DeyV Zgadzam sie z Toba odnosnie wypowiedzi @bendi Limit jest po to zeby go stosowac. Teoretycznie powinno to tak wygladac ze zwraca rekordy wedlug wewnecznych oid (jak w pg). Stosowanie takie jak zaleca bendi jest tylko wymagane w ORACLE bo tam nie ma czegos takiego jak LIMIT. Jesli chcemy natomist w mysqlu stosowac samo WHERE do ograniczenia zbioru to nie daje sie limit (bo po co?) wszystko mozna zalatwic WHERE. Oczywiscie pod warunkiem ze warunkiem jest pole z indeksem.
-------------------- |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 504 Pomógł: 2 Dołączył: 31.03.2006 Skąd: Londyn Ostrzeżenie: (0%) ![]() ![]() |
Struktura bazy danych:
Pierwsza tabela (gowna) user_id => int => primary key (reszta danych mysle niewazna) Nastepne dwie maja dwa pola user_id => int => index (nie wiem czy tutaj tez primary key czy index wsyatrczy) pole1 => text (z tego nie kozystam w zadnej relacji) I nadal mam problem ze skonruowaniem zapytania. To jak z metodologia ![]() ![]() I jeszcze jedno pytanie. Czy wyciagajac rekord z tabeli zapytaniem podobnym do :
Musze pozniej robic mysql_fetch ? Czy skoro jest wyciagana tylko jedna zmeinna mozna jrj uzyc bezposrednio ? -------------------- "Wizja czasu jest szeroka, lecz kiedy sie przez nia przechodzi, czas staje sie waskimi drzwiami"
![]() |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 12.06.2025 - 15:20 |