Ноя
28
2008
--

InnoDB, count() в больших базах данных.

Как известно, InnoDB не очень хорош при работе с ключами.
Даже при вызове count() по PRIMARY INDEX – будет сканироватся вся таблица. А при огромном количестве записей – ето очень долго.

Вот один выход из проблемы:

CREATE TABLE `count_index_table` (
  `id` int(4) unsigned NOT NULL auto_increment,
  `name` char(100) NOT NULL,
  `size` bigint(20) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB;
 
-- Ну очень большая таблица
CREATE TABLE `datatable` (
  `id` bigint(20) unsigned NOT NULL auto_increment,
  `datalong` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB;
 
CREATE TRIGGER `datatable_before_ins` AFTER INSERT ON `datatable`
  FOR EACH ROW
BEGIN
   UPDATE count_index_table
   SET count_index_table.size = count_index_table.size +1
   WHERE count_index_table.name = 'datatable';
END;
 
CREATE TRIGGER `datatable_after_del` AFTER DELETE ON `count1i`
  FOR EACH ROW
BEGIN
   UPDATE count_index_table
   SET count_index_table.size = count_index_table.size-1
   WHERE count_index_table.name = 'datatable';
END;

Источник: http://sql.ru/forum/actualthread.aspx?tid=280049#2535574

Опубликовал adik в Технотрония | Метки:

Работает на WordPress | Локализация: goodwin.wpbot.ru