MySQL InnoDB производительность вставки (Windows) - PullRequest
1 голос
/ 05 мая 2011

Я новичок в MySQL, и у меня есть некоторые сомнения по поводу производительности InnoDB .У меня есть таблица, в которой я хочу сохранить некоторые меры, и я тестирую интенсивную вставку с использованием цикла в хранимой процедуре:

CREATE TABLE `measures` (
  `Id` int(10) unsigned NOT NULL,
  `DT` datetime NOT NULL,
  `TF1` float DEFAULT '0',
  `IF1` float DEFAULT '0',
  `PAF1` float DEFAULT '0',
  `PRF1` float DEFAULT '0',
  `CF1` float DEFAULT '0',
  `TF2` float DEFAULT '0',
  `IF2` float DEFAULT '0',
  `PAF2` float DEFAULT '0',
  `PRF2` float DEFAULT '0',
  `CF2` float DEFAULT '0',
  `TF3` float DEFAULT '0',
  `IF3` float DEFAULT '0',
  `PAF3` float DEFAULT '0',
  `PRF3` float DEFAULT '0',
  `CF3` float DEFAULT '0',
  `CTotal` float DEFAULT '0',
  PRIMARY KEY (`Id`,`DT`),
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE PROCEDURE `sp_INSERT_TEST`()
BEGIN
        DECLARE i INT DEFAULT 1;

        WHILE (i<=6000) DO

            INSERT INTO measures
            (Id, DT, TF1, IF1, PAF1, PRF1, CF1, TF2, IF2, PAF2, PRF2, CF2, 
TF3, IF3, PAF3, PRF3, CF3, CTotal) 
            VALUES 
            (1, TIMESTAMPADD(MINUTE,i, NOW()), 
            0.1, 1, 10, 100, 1000,
            0.2, 2, 20, 200, 2000,
            0.3, 3, 30, 300, 3000,
            i * 10);

            SET i=i+1;
        END WHILE;
END

Общее время выполнения составляет около 150 секунд , но если я использую MyISAM вместо InnoDB, время будет около 0,2 секунды .

Является ли эта разница в производительности между двумя двигателями нормальной?Можно ли улучшить вставки, используя InnoDB, чтобы приблизиться к производительности MyISAM или это ограничение движка?

Примечание: я использую MySQL 5.1.56 (64 бит) , Windows 7 x64 , с конфигурацией по умолчанию для компьютера разработчика (я также пробовал настройку сервера, но производительность аналогична).

Заранее спасибо.John

Ответы [ 6 ]

3 голосов
/ 05 мая 2011

Точно так же, как в peufeu говорят, что вы можете значительно повысить производительность, используя только одну транзакцию.Если вы хотите расслабить ACID, вы можете добиться еще лучшей производительности, установив

innodb_flush_log_at_trx_commit=0

в my.ini.

1 голос
/ 05 мая 2011

Да, это нормально.Как и все транзакционные БД, InnoDB должен обеспечить согласованность ACID, которая требует большой работы, а также то, что убивает вашу производительность, так это то, что в конце каждой транзакции он должен ждать, пока жесткий диск скажет «ОК, данные записаны»,что касается «D = Durability» в ACID.

Решение состоит в том, чтобы просто выдать ваш массовый INSERT за одну транзакцию, т.е. BEGIN, массовый INSERT, COMMIT.

Или использовать что-то более адаптированное,например, НАГРУЗКА ДАННЫХ INFILE, или, по крайней мере, используйте многострочные ВСТАВКИ.

1 голос
/ 05 мая 2011

InnoDB часто медленнее, чем MyISAM, и является транзакционным механизмом БД со свойствами ACID .Тем не менее, изменение конфигурации или способа работы может оказать большое влияние на скорость.

Первое, что не сработает: добавление кешей бесполезно, а уменьшение числа индексов в таблице помогает, потому что выВам нужно создавать меньше индексов при вставке, но в вашем случае у вас есть только первичный ключ.

Я предлагаю попробовать один из следующих вариантов:

  • Выполнить все запросы INSERT в одной транзакции , а затем зафиксировать в конце.

    Пример: SET autocommit = 0;ВСТАВИТЬ заявления;COMMIT;

  • Использовать расширенный синтаксис вставки , который позволяет вставлять много строк вместе.Я думал, что InnoDB не поддерживает это, но я только попытался с MySQL 5.0.75, и это работало.Я не думаю, что вы можете ВСТАВИТЬ все 6000 строк одновременно, потому что вы ограничены max_allowed_packet (вы можете увеличить его, если хотите).Вы можете вставлять 500 строк одновременно, например.

    Пример: INSERT INTO таблица (field1, field2) VALUES (1, test '), (2,' hello ');

0 голосов
/ 07 мая 2011

В дополнение ко всему, что сказал stivlo - вам может пригодиться следующая статья и сопровождающее видео.

http://www.mysqlperformanceblog.com/2011/03/18/video-the-innodb-storage-engine-for-mysql/

, как говорит Морган Токер в своей презентации: «друзья не позволяют друзьямиспользуйте myisam "

надеюсь, что вы найдете его поучительным:)

0 голосов
/ 06 мая 2011

Остальные постеры правы - делайте все за одну транзакцию.

6000 строк - такая крошечная таблица, производительность вставки не очень важна для такого крошечного набора данных.

В любом случае ни одна современная база данных не оптимизирована для таких "игрушечных" систем.

Попробуйте миллиард записей, сделайте это с транзакциями разумного размера и посмотрите, кто тогда выиграет.

Потяните за вилку и посмотрите, кто быстрее восстанавливается (подсказка: это не будет myisam)

Использование LOAD DATA INFILE или пакетной вставки может повысить производительность хранимой процедуры, даже если она выполняется в одной транзакции, поскольку язык mysql SP не всегда особенно эффективен.

0 голосов
/ 05 мая 2011

MyISAM быстрее, чем InnoDB, когда дело доходит до вставки, но не с запасом в 750 раз, что указывает на необходимость настройки InnoDB. Эта тема обсуждалась ранее, например, вы можете прочитать некоторые хорошие вещи в следующем блоге .

...