Autor Zpráva
Itak
Profil *
Ahoj, mám tuto tabulku:

CREATE TABLE IF NOT EXISTS `logs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`typ_objektu` set(....nejake hodnoty....) NOT NULL,
`id_objektu` varchar(63) NOT NULL,
`ip` varchar(16) DEFAULT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`note` varchar(250) NOT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `id_objektu` (`id_objektu`),
KEY `ts` (`timestamp`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=108494 ;


Obsah je cca 90 000 řádků.

Pokud zavolám tento dotaz:
SELECT SQL_CALC_FOUND_ROWS *
FROM LOGS ORDER BY timestamp DESC
LIMIT 0 , 50

Tak mi dotaz trvá asi 30 sekund. Myslíte, že se najde nějaký optimilizace?

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE LOGS ALL NULL NULL NULL NULL 86220 Using filesort
Tori
Profil
Pokud nerecyklujete ID, tak jsou záznamy uložené podle timestamp vzestupně. Tzn by možná bylo rychlejší vypsat prostě posledních 50 řádků, bez řazení (dvěma dotazy).
Kajman_
Profil *
Když vynecháte SQL_CALC_FOUND_ROWS, bude v explain rozdíl?

Když poradíte použití indexu ts, bude rozdíl?
Itak
Profil *
Tori: na to bych se nechtěl úplně spoléhat do budoucna
Kajman: pokud CALC vynechám, tak to je za 0,006 s .-), ale počet všech řádku potřebuji znát - pokud nasadím force nebo use index, tak PhpMyAdmin nic nevrátí, jako by neměl výsledek
SELECT SQL_CALC_FOUND_ROWS *
FROM LOGS FORCE INDEX (ts) ORDER BY timestamp DESC
LIMIT 0 , 50
Alphard
Profil
Itak:
ale počet všech řádku potřebuji znát
Zkuste select count(id) from logs
Kajman_
Profil *
Itak:
tak PhpMyAdmin nic nevrátí, jako by neměl výsledek

Nevypíše ani chybu? A v jiném programu, třeba Admineru?

Zkuste zkontrolovat název indexu, zda ts opravdu existuje:
show index from logs.

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:

0