Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Przewidzenie paginacji bez odpalania całego zapytania
kiler129
post 4.07.2012, 04:59:31
Post #1





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

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


Witajcie!
Zastanawiam się w jaki sposób phpMyAdmin "wie", że będzie następna strona w wynikach?
Staram się zrobić dobrą paginację bez uciekania się do zastąpienia pól za pomocą COUNT(`id`) - wymusza to na mnie podwójne wykonanie zapytania, raz na całości [która może mieć i 80 tys rekordów] a drugi raz już z limitem. Do tego problem stwarzają skomplikowane zapytania (których wyniki są jednak cachowane).


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
!*!
post 4.07.2012, 12:20:10
Post #2





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Cytat
Staram się zrobić dobrą paginację bez uciekania się do zastąpienia pól za pomocą COUNT(`id`)

To się wyklucza wzajemnie. Paginacja to nic innego jak zliczenie i operowanie limitem. Reszta nie jest zależna od samego zapytania, a od tego jak te dane wyświetlisz.

Ten post edytował !*! 4.07.2012, 12:21:40


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
d3ut3r
post 4.07.2012, 12:43:54
Post #3





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

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


jest jeszcze:

SQL_CALC_FOUND_ROWS

jednak nie zawsze to dobry pomysł aby dowiedzieć się dlaczego, wystarczy w google wpisać smile.gif warto jednak przetestować u siebie takie rozwiązanie, bo może okazać się dużo szybsze niż 2 zapytania.


--------------------
http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
Go to the top of the page
+Quote Post
mmmmmmm
post 4.07.2012, 13:05:21
Post #4





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Jeśli robisz prostą przeglądarkę tabel (bez połączeń z innymi tabelami i bez warunków), to z:
SELECT * FROM information_schema.tables WHERE table_schema = 'twoja_baza_danych' and table_name='twoja_tabela'
możesz wyciągnąć podstawowe informacje jak. np. ilość rekordów (TABLE_ROWS), tylko że dla InnoDB są to wartości przybliżone... Więc tak naprawdę nie ma innego sposobu jak liczenie najpierw...
Go to the top of the page
+Quote Post
maly_swd
post 4.07.2012, 15:44:15
Post #5





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


To sie robi troche inaczej.

Zalozenie ze na stronie wyswietlasz 20 wynikow. Chcesz zrobic tak ze w paginacji jest

1 - 2 - (3)- 4 >
Zalozmy ze jestes na 3 stronie, pobierasz wtedy zapytaniem z limitem 3*20, 21 wierszy (nie 20 tylko 21 poniewasz jak dostaniesz mniej niz 21 to znaczy ze nie ma nastepnej strony), a jak dostaniesz 21 to wiesz ze jest nastepna strona.



--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
Go to the top of the page
+Quote Post
Adi32
post 5.07.2012, 14:12:22
Post #6





Grupa: Zarejestrowani
Postów: 348
Pomógł: 26
Dołączył: 8.10.2008
Skąd: Lublin

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


Lekka przesada.
Ja jestem za tradycyjnym count(id).
Jeżeli się mylę to mnie poprawcie ale chyba czytałem gdzieś, że count(id) nie 'liczy' wszystkiego (o ile id jest primary) tylko zwraca sumę rekordów w przeciwieństwie do count(*).


--------------------
Wolałem języki z rodziny C ale poszedłem na łatwizne...
Go to the top of the page
+Quote Post
hind
post 5.07.2012, 14:49:57
Post #7





Grupa: Zarejestrowani
Postów: 142
Pomógł: 24
Dołączył: 30.03.2009
Skąd: Rokitno Szlacheckie

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


z tego co mi wiadomo to count nie zlicza wartości null
więc jeśli masz id == NULL to może go nie zliczyć przy count(id), ale przy count(*) już może zliczyć.
Go to the top of the page
+Quote Post
rzymek01
post 5.07.2012, 14:55:05
Post #8





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

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


zróbcie sobie testy wydajności zapytania count(id), gdzie id to primary key
przecież to indeks, nie wierzę, że nie zapisałby sobie 4 bajtów na inta, a sądząc po tym, że do szukania korzysta z szukania binarnego, to musi znać granice przedziałów, więc, wg mnie to tylko odczytanie inta i zwrócenie,
oczywiście zapytanie mozna sobie wczesniej "spreparować" czy utworzyć procedurę w mysql, żeby nie tracić czasu na parsowanie zapytania


--------------------
:]
Go to the top of the page
+Quote Post
Adi32
post 5.07.2012, 15:06:16
Post #9





Grupa: Zarejestrowani
Postów: 348
Pomógł: 26
Dołączył: 8.10.2008
Skąd: Lublin

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


Cytat(hind @ 5.07.2012, 15:49:57 ) *
z tego co mi wiadomo to count nie zlicza wartości null
więc jeśli masz id == NULL to może go nie zliczyć przy count(id), ale przy count(*) już może zliczyć.

Primary key dodatkowo z AUTO INCREMENT nigdy nie będzie pusty...

Ten post edytował Adi32 5.07.2012, 15:08:23


--------------------
Wolałem języki z rodziny C ale poszedłem na łatwizne...
Go to the top of the page
+Quote Post
mmmmmmm
post 5.07.2012, 15:10:33
Post #10





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Cytat(Adi32 @ 5.07.2012, 16:06:16 ) *
Primary key dodatkowo z AUTO INCREMENT nigdy nie będzie pusty...

Przy LEFT/RIGHT JOINie może być smile.gif
Go to the top of the page
+Quote Post
!*!
post 5.07.2012, 15:18:29
Post #11





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Cytat
Przy LEFT/RIGHT JOINie może być

Hm podaj jakiś przykład, bo chyba Cie nie rozumiem.


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
Adi32
post 5.07.2012, 15:24:40
Post #12





Grupa: Zarejestrowani
Postów: 348
Pomógł: 26
Dołączył: 8.10.2008
Skąd: Lublin

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


Jemu chyba chodziło o to, że jeżeli w zapytaniu w którym są JOINY pole id może być puste.
Wydaje mi sie, że jest to raczej nie możliwe, jakie zapytanie by nie było id nie zgubi swojej zawartości.

Dodatkowo zastanawiam się, czy przy robieniu stronicowania istnieje opcja, żeby trzeba było robić JOINy... (?)
Edit: Chodzi o zapytanie zliczające (lub pobierające) ilość elementów.

Ten post edytował Adi32 5.07.2012, 15:27:23


--------------------
Wolałem języki z rodziny C ale poszedłem na łatwizne...
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 Wersja Lo-Fi Aktualny czas: 9.08.2025 - 21:11