Wie optimieren COUNT(*) performance auf InnoDB durch die Verwendung von index

Ich habe eine ziemlich große, aber schmale InnoDB-Tabelle mit ~9m records. Dabei count(*) oder count(id) auf dem Tisch ist extrem langsam (6+ Sekunden):

DROP TABLE IF EXISTS `perf2`;

CREATE TABLE `perf2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `channel_id` int(11) DEFAULT NULL,
  `timestamp` bigint(20) NOT NULL,
  `value` double NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ts_uniq` (`channel_id`,`timestamp`),
  KEY `IDX_CHANNEL_ID` (`channel_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

RESET QUERY CACHE;
SELECT COUNT(*) FROM perf2;

Während die Anweisung wird nicht ausgeführt, zu oft wäre es schön, es zu optimieren. Nach http://www.cloudspace.com/blog/2009/08/06/fast-mysql-innodb-count-really-fast/ dies sollte möglich sein, durch erzwingen einer InnoDB einen index:

SELECT COUNT(id) FROM perf2 USE INDEX (PRIMARY);

Den explain plan scheint in Ordnung zu sein:

id  select_type table   type    possible_keys   key     key_len ref     rows    Extra
1   SIMPLE      perf2   index   NULL            PRIMARY 4       NULL    8906459 Using index

Leider die Aussage ist so langsam wie vorher. Nach "SELECT COUNT(*)" ist langsam, sogar mit where-Klausel ich habe auch versucht die Optimierung die Tabelle ohne Erfolg.

Was/ist/wieder eine Möglichkeit zur Optimierung der COUNT(*) Leistung auf InnoDB?

Wechsel zu MyISAM, kann Wunder tun - und es kostet nur ein einzelnes klicken in PHPMyAdmin .)
Auch die Kosten der Durchsetzung von Fremdschlüsseln und Transaktionen verwenden.
jetzt begreife ich, ich dachte du meintest Transaktionen oder foreign keys waren obligatorisch für MyISAM -, das glaube ich nicht. Missverstanden "erzwingen"
wahr, aber nicht die Frage, die gestellt wird :/
Der index für channel_id ist redundant mit der beginnend mit Spalte; drop die ehemaligen.

InformationsquelleAutor andig | 2013-10-09

Schreibe einen Kommentar