count(*) dauert ewig bei innodb trotz index
Posted: 2008-10-15 11:44
Hallo!
Ich habe folgende Tabelle:
--
-- Tabellenstruktur für Tabelle `bayes_token`
--
CREATE TABLE `bayes_token` (
`id` int(11) NOT NULL default '0',
`token` char(5) NOT NULL default '',
`spam_count` int(11) NOT NULL default '0',
`ham_count` int(11) NOT NULL default '0',
`atime` int(11) NOT NULL default '0',
PRIMARY KEY (`id`,`token`),
KEY `bayes_token_idx1` (`token`),
KEY `bayes_token_idx2` (`id`,`atime`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Wie sicherlich schon einige erkennen handelt es sich dabei um eine Tabelle des Spamassassin.
Mit dem Spamassassin wird ein script mitgeliefert dass die alten Einträge entfernt und so die DB aktuell und klein bzw. schnell hält.
Das skript macht selects von der Art:
SELECT count( * ) FROM `bayes_token` WHERE id =1 AND atime >1224012215;
Diese dauern mitunter ziemlich lange. Laut slow query log max. sogar 11410 Sekunden.
EXPLAIN EXTENDED SELECT count( * ) FROM `bayes_token` WHERE id =1 AND atime >1224012215
liefert:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE bayes_token ref PRIMARY,bayes_token_idx2 bayes_token_idx2 4 const 95779 Using where; Using index
Ich versteh nun zB nicht warum Mysql einen ref select macht und keinen range select...? Und warum dies solange dauert. Hatte bis jetzt immer nur mit großen MyIsam Tabellen zu tun (10Gb aufwärts) und die flutschten wenn man den Index benutzte. Bei der Tabelle versteh ichs leider nicht.
Die verwendete MySQL Version ist übrigens: 5.0.22
Danke schonmal im voraus
Bru
Ich habe folgende Tabelle:
--
-- Tabellenstruktur für Tabelle `bayes_token`
--
CREATE TABLE `bayes_token` (
`id` int(11) NOT NULL default '0',
`token` char(5) NOT NULL default '',
`spam_count` int(11) NOT NULL default '0',
`ham_count` int(11) NOT NULL default '0',
`atime` int(11) NOT NULL default '0',
PRIMARY KEY (`id`,`token`),
KEY `bayes_token_idx1` (`token`),
KEY `bayes_token_idx2` (`id`,`atime`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Wie sicherlich schon einige erkennen handelt es sich dabei um eine Tabelle des Spamassassin.
Mit dem Spamassassin wird ein script mitgeliefert dass die alten Einträge entfernt und so die DB aktuell und klein bzw. schnell hält.
Das skript macht selects von der Art:
SELECT count( * ) FROM `bayes_token` WHERE id =1 AND atime >1224012215;
Diese dauern mitunter ziemlich lange. Laut slow query log max. sogar 11410 Sekunden.
EXPLAIN EXTENDED SELECT count( * ) FROM `bayes_token` WHERE id =1 AND atime >1224012215
liefert:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE bayes_token ref PRIMARY,bayes_token_idx2 bayes_token_idx2 4 const 95779 Using where; Using index
Ich versteh nun zB nicht warum Mysql einen ref select macht und keinen range select...? Und warum dies solange dauert. Hatte bis jetzt immer nur mit großen MyIsam Tabellen zu tun (10Gb aufwärts) und die flutschten wenn man den Index benutzte. Bei der Tabelle versteh ichs leider nicht.
Die verwendete MySQL Version ist übrigens: 5.0.22
Danke schonmal im voraus
Bru