Autor Zpráva
__construct
Profil
Chcem sa opýtať Vás, ktorý používate InnoDB ako riešite zistenie počtu riadkov (potrebujem to kvôli stránkovaniu)
Počítať to pri každom načítaní stránky nechcem pretože tá tabuľka bude dosť veľká.
Uvažujem nad dvoma možnosťami:
- vyťahovať túto informáciu z information_schema
- urobiť si nejakú "systémovú tabuľku" a napísať si trigger k tabuľke ktorej počet riadkov chcem zisťovať
Nox
Profil
__construct:
Tipuju že (b) by bylo dost podobný jako (a) akorát ještě jednou navíc a nejspíš pomalej... osobně to dělám přes information_schema
__construct
Profil
Nox:
Tipuju že (b) by bylo dost podobný jako (a) akorát ještě jednou navíc a nejspíš pomalej... osobně to dělám přes information_schema
Práveže mám obavy že information_schema bude pomalšie, pretože vytiahnutie počtu riadkov jednej testovacej tabuľky kde je cez 2,5 mil. riadkov trvá cca. 0,2 sek
ninja
Profil
Má ta tabulka nějaký unikátní (primírní) klíč? AFAIK MySQL i u InnoDB drží počet řádek v tabulce jako separátní informaci a jeji získání (pokud nejsou zapojeny nějaké podmínky či joiny) by měla být "okamžitá".
__construct
Profil
ninja:
by měla být "okamžitá"
Viem. Lenže ako som písal pri vyťahovaní informácií o talbuľke ktorá má milióny riadkov to trvá dlhšie ako pri bežnej tabuľke (cca 100 riadkov)
Používam tento dotaz:
SELECT 
`TABLE_ROWS` AS `pocet` 
FROM `information_schema`.`TABLES` 
WHERE `TABLES`.`TABLE_SCHEMA` = 'databaza' 
AND `TABLES`.`TABLE_NAME` = 'tabulka' 
LIMIT 1
Nox
Profil
__construct:
"jako separátní informaci a jeji získání"
... čili hodnota v meta informacích tabulky.... a pak je jedno, kolik je záznamů

ninja, __construct:
jenže ono to není nejspíš pravda kvůli transakcím, takto to má jen MyISAM... hodnota by mohla být (jak se píše viz odkaz) pro každou transakci jiná*

http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/

což ale neodpovídá na původní dotaz...

*) z toho mj. chápu že záznam v information_schema a asi i trigger budou také jen přibližné
ninja
Profil
IMHO na stránkování přibližná hodnota stačí.

__construct: Jak ti vychází ten tvuj dotaz oproti prostému
SELECT COUNT(*) FROM tabulka;
případně místo hvězdičky primary key sloupec?
__construct
Profil
ninja:
SELECT COUNT(*) FROM tabulka;
Robíš si srandu :-) ?
Ak máš v tabuľke milióny riadkov tak ich počíta rádovo v sekundách.
joe
Profil
A napadlo tě, že bys to nepočítal vůbec? ;-)

Takže nějak takhle:

Na stránce budeš chtít mít vypsáno dejme tomu 20 záznamů. Budeš vytahovat vždycky o jeden navíc, takže 21 a vypisovat jich jen 20. Pokud jich bude 21, zobrazíš odkaz na další stránku, když jich bude míň jak 21, jseš na poslední stránce. Můžeš taky přidat odkaz na poslední a teprve až po kliknutí na tento odkaz budeš počítat řádky, resp. možná to jde udělat se záporným offsetem tak, abys ty řádky taky počítat nemusel.

Vždycky bys teda mohl zobrazit jako odkazy (případně v select boxu) stránky nižší (protože víš, že to máš číslované od 1ky + stránku o 1 vyšší, protože víš, že jich bylo 21).

Chápu, že to nemusí být zrovna ideální, ale myslím, že to je lepší než počítat pokaždé řádky, ne? :)

(takhle nějak si myslím, že to má třeba DeviantArt)
ninja
Profil
__construct: Srandu si nedělemám Mám tu InnoDB tabulku, těsně pod půl mega řádků a explain my na count vrací

id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra 
1	SIMPLE	vstupenkaold	index	NULL	stav	1	NULL	483688	Using index


Rychlost je v rámci možností serveru okamžitá.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0