Сравнение скорости выполнения INSERT/INSERT DELAYED для таблиц типа HEAP (MEMORY), InnoDB и MyISAM

Я сейчас работаю над очень интересным проектом, который, как надеется заказчик, составит серьёзную конкуренцию Google Analytics. Но речь не об этом. Разбираясь с архитектурой системы, я обнаружил весьма интересную деталь: 8 гигабайт памяти сервера отдается под несколько таблиц типа HEAP. Так как HEAP-таблицы хранятся в исключительно в памяти, то операция вставки (INSERT) должна выполняться очень быстро, так как временные затраты, связанные с перемещением головок диска и физической записью, отсутствуют. Я решил найти подтверждение этой теории. Google is your friend, и я довольно быстро нашел статью MySQL Engine INSERT speed.

Меня несколько смутили результаты, приведённые автором:

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

Первыми возникшими вопросами были:

  1. Какой тип вставки использовался для MyISAM/InnoDB-таблиц — INSERT или INSERT DELAYED?
  2. Каким образом вставлялись данные — построчно или блочно (extended insert)?
  3. Значение AUTOCOMMIT при работе с таблицей InnoDB.

Об этом оставалось только гадать, поэтому я решил повторить этот эксперимент.

Методика эксперимента:
Создаются три таблицы:

[-]
View Code MySQL
CREATE TABLE `test0` (
    `field` INTEGER UNSIGNED NOT NULL
) TYPE=HEAP;

CREATE TABLE `test1` (
    `field` INTEGER UNSIGNED NOT NULL
) TYPE=InnoDB;

CREATE TABLE `test2` (
    `field` INTEGER UNSIGNED NOT NULL
) TYPE=MyISAM DELAY_KEY_WRITE=1;

Перед началом эксперимента выполнялась команда

[-]
View Code MySQL
SET AUTOCOMMIT=0

Затем в цикле в таблицу вставлялись случайно сгенерированные данные (компьютер, на котором проводился эксперимент, был слабый, поэтому я ограничился тридцатью тысячами записями). После цикла выполнялся COMMIT. Скрипт выполнялся 10 раз, бралось среднее время.

Исходный текст скрипта:

[-]
View Code PHP
<?php
    set_time_limit(0);

    function microtime_float()
    {
        list($usec, $sec) = explode(" ", microtime());
        return (float)$usec + (float)$sec;
    }


    $link = mysql_connect('localhost', 'root', '');
    mysql_select_db('test', $link);

    $schema = "CREATE TABLE `test` (`field` INTEGER UNSIGNED NOT NULL)";
    $engines = array(
        ' TYPE=HEAP',
        ' TYPE=InnoDB',
        ' DELAY_KEY_WRITE = 1 TYPE=MyISAM'
    );

    $inserts = array(
        '',
        '',
        'DELAYED',
    );

    mysql_query("DROP TABLE IF EXISTS `test0`, `test1`, `test2`");
    mysql_query("SET AUTOCOMMIT=0");

    for ($i=0; $i<count($engines); ++$i) {
        $query = preg_replace('/`test`/', "`test{$i}`", $schema) . $engines[$i];
        mysql_query($query);
        mysql_query("COMMIT", $link);

        $start = microtime_float();
        for ($j=0; $j<30000; ++$j) {
            $val = mt_rand();
            mysql_query("INSERT {$inserts[$i]} INTO `test{$i}` (`field`) VALUES({$val})", $link);
        }

        mysql_query("COMMIT", $link);
        $end = microtime_float();
        print $end - $start . "\n";
    }

    mysql_close($link);
?>

У меня получились такие результаты (я привожу относительную — относительно таблиц типа HEAPскорость):

  HEAP InnoDB MyISAM
INSERT 1.000 1.277 1.162
INSERT DELAYED 2.125 0.998

Эксперимент показал, что разница по скорости между INSERT DELAYED для таблицы MyISAM и INSERT для таблицы HEAP очень незначительна. Таблицы InnoDB действительно оказались медленнее, но не сильно. Большую роль здесь могла сыграть “слабость” тестового компьютера и значение переменной innodb_flush_log_at_trx_commit. Вдобавок, MyISAM был сконфигурирован очень даже хорошо, в то время как InnoDB использовал практически значения по умолчанию (мне редко приходится пользоваться таблицами InnoDB, поэтому тонкой настройкой я не занимался). Тем не менее, результаты проведенного мной эксперимента совсем не согласуются с данными, приведёнными в исходной статье. Кто же из нас прав?

Добавить в закладки
  • del.ici.ous
  • Digg
  • Furl
  • Google
  • Simpy
  • Spurl
  • Y! MyWeb
  • БобрДобр
  • Мистер Вонг
  • Yandex.Закладки
  • Текст 2.0
  • News2
  • AddScoop
  • RuSpace
  • RUmarkz
  • Memori
  • Google Bookmarks
  • Писали
  • СМИ 2
  • Моё Место
  • 100 Закладок
  • Ваау!
  • Technorati
  • RuCity
  • LinkStore
  • NewsLand
  • Lopas
  • Закладки - IN.UA
  • Connotea
  • Bibsonomy
  • Trucking Bookmarks
  • Communizm
  • UCA
  • Slashdot
  • Magnolia
  • Blogmarks
  • Current
  • Meneame
  • Oknotizie
  • Diigo
  • Funp
  • Hugg
  • Dealspl.us
  • N4G
  • Mister Wong
  • Faves
  • Yigg
  • Fresqui
  • Care2
  • Kirtsy
  • Sphinn
  • SaveThis.ru

Связанные записи

20
Март
2008

Комментарии к статье «MySQL и скорость выполнения INSERT для разных типов таблиц» (2)  »

  1. Andrei says:

    HEAP InnoDB MyISAM
    INSERT 1.000 1.277 1.162
    INSERT DELAYED 2.125 0.998

    А как эти данные сопоставить с числом запросов, что есть ЕДИНИЦЕЙ в этой таблице??

  2. Vladimir says:

    Я измерял скорость вставки данных относительно скорости выполнения операции INSERT в HEAP-таблицу. То есть все полученные значения делились на значение INSERT(HEAP), и таким образом получались относительные значения.

Подписаться на RSS-ленту комментариев к статье «MySQL и скорость выполнения INSERT для разных типов таблиц» Trackback URL: http://blog.sjinks.org.ua/mysql/44-mysql-insert-speed-for-different-storage-engines/trackback/

Оставить комментарий к записи «MySQL и скорость выполнения INSERT для разных типов таблиц»

Вы можете использовать данные тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, Вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя