Autor Zpráva
Sirius
Profil
Zdravím,

potřebuji zjistit počet řádků v tabulce. Zkoušel jsem jak count(), tak mysql_num_rows(), ale vždy se mi vrátí hodnota maximálně 54600, i když počet záznamů je vyšší.

Nevíte čím by to mohlo být? Moje hledání bylo neúspěšné.
TomášK
Profil
Sirius:
Tipuju, že COUNT(*) vrací dobrý výsledek a chyba bude někde jinde. Neprovedou se inserty nebo něco takového. Jak víte, kolik je záznamů v databázi?
l564
Profil
TomášK:
Jak víte, kolik je záznamů v databázi?

Buď se podívá přes My Admina nebo si nechá vypsat ID poslední
Sirius
Profil
PMA mi nad těch 54600 taky blbne, když se pokusím vybrat všechny záznamy a seřadit je podle ID, tak vrátí 0 řádků. Momentálně to řeším přes max(id), ale stejně by mne zajímalo, proč to dělá neplechu. Žádná z použitých funkcí podle dokumentace nemá omezení (rozhodně ne 54600) a v konfiguračních souborech jsem taky nic nenašel.

Tabulka vypadá následovně:

- id - int, UNSIGNED, PRIMARY
- varchar(120)
- boolean

A na čem to (ne)běží:

# Apache/2.2.15 (Win32) PHP/5.3.2
# Verze MySQL klienta: mysqlnd 5.0.7-dev - 091210 - $Revision: 294543 $
TomášK
Profil
l564:
MyAdmin dělá tentýž dotaz.

Zkusil bych dotaz, který zkontroluje, že jsou v tabulce opravdu všechny id - že v nich nejsou díry. Zkusil bych přidat jeden záznam ručně a ověřit, že se výsledek nezmění. 54 600 je opravdu divné číslo, proto se mi nechce věřit, že by se na něm zasekl.
Sirius
Profil
TomášK:
Všechny ID tam jsou, to už jsem kontroloval.

Číslo se teď změnilo na 54709, což je skutečná hodnota, ale trvalo to skoro dvě hodiny od posledního insertu, během té doby jsem data nijak neupravoval, pouze vypisoval.

http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_count
"This optimization applies only to MyISAM tables only, because an exact row count is stored for this storage engine and can be accessed very quickly."
Chápu to správně, že počet řádků tak jak ho zjišťuje count() se ukládá bokem? I kdyby tam byla prodleva, což se mi nezdá, tak mysql_num_rows() by mělo vrátit správné číslo.
TomášK
Profil
Sirius:
Ano, chápeš to správně, ukládá se bokem, aby se pokaždé nemusela procházet celá tabulka. Pro InnoDB se též neprochází tabulka, ale používá se primární index. Nevím, jestli je v něm přímo uložené, kolik je v tabulce záznamů, nebo jestli se musí projít. Můžeš zkusit http://dev.mysql.com/doc/refman/5.0/en/rebuilding-tables.html. Ale předpokládám, že pokud jsi vybral celou sadu a použil mysql_num_rows, počítá záznamy, když je prochází a měl by vrátit správné číslo. Ještě mě napadá, že by to mohlo souviset s transakcemi, pokud používáš InnoDB a byl by vypnutý autocommit.
Sirius
Profil
Rebuild nezabral. Právě to mysql_num_rows() je to co mi teď vrtá hlavou, chroupe to dlouho a pak stejně vyhodí stejné, většinou chybné, číslo jako count(). Zjistil jsem, že když záznamy přidávám / ubírám, tak občas se změny projeví hned, občas tomu číslu trvá se změnit. Jinak používám MyISAM. Max() zatím funguje spolehlivě, tak jsem si trochu poupravil kód a běhá to jak má. Až budu mít víc času, tak zkusím přeinstalovat MySQL.

Díky za pomoc.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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