Autor | Zpráva | ||
---|---|---|---|
__construct Profil |
#1 · Zasláno: 28. 6. 2010, 09:49:54
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 |
#2 · Zasláno: 28. 6. 2010, 10:11:53
__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 |
#3 · Zasláno: 28. 6. 2010, 10:17:15
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 |
#4 · Zasláno: 28. 6. 2010, 10:58:26
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 |
#5 · Zasláno: 28. 6. 2010, 11:13:53
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 |
#6 · Zasláno: 28. 6. 2010, 11:37:33 · Upravil/a: Nox
__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 |
#7 · Zasláno: 28. 6. 2010, 12:58:17
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; |
||
__construct Profil |
#8 · Zasláno: 28. 6. 2010, 14:16:02
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 |
#9 · Zasláno: 28. 6. 2010, 14:27:12 · Upravil/a: joe
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 |
#10 · Zasláno: 28. 6. 2010, 17:13:22
__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á. |
||
Časová prodleva: 14 let
|
0