Выполнение 3 запросов к базе данных 1k раз в два раза быстрее с транзакцией, чем без.Правильный? - PullRequest
3 голосов
/ 16 февраля 2012

Я делаю небольшой тест. Следующий код выполняет 3 случайных запроса 1000 раз (к таблице innoDB):

delimiter //
create procedure dtest ()
begin
declare v_max int;
declare v_counter int default 0;
declare holder int;
set v_max = 1000;
  truncate table user;

  start transaction;

  while v_counter < v_max do
    # random query
    insert into user (username) values (CONCAT("user", floor(0 + (rand() * 65535))));
    select count(*) from user into holder;
    select count(*) from user where username = 'user' into holder;
    set v_counter = v_counter + 1;
  end while;

  commit;

end //

Я запустил приведенный выше код с start transaction; и commit;, а затем снова удалил эти два оператора.

Идея заключалась в том, что я хотел посмотреть, будет ли он работать медленнее с определенной транзакцией, чем без нее.

Я обнаружил, что первый тест с start transaction/commit тест выполняется в течение ~ 7 секунд. Когда я удалил start transaction/commit, запрос выполняется через ~ 15 секунд!

Это была намного большая разница, чем я ожидал. Интересно, есть ли что-то, чего я не понимаю?

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Простой ответ в этом случае заключается в том, что объединение записи позволило объединенному INSERT, являющемуся результатом цикла запроса, быстрее попасть на диск, чем отдельные запросы.

Неответ так прост, что это сильно зависит от вашего оборудования и ОС - например, Intel Atom с современным SSD (предположительно с привязкой к процессору) будет реагировать иначе, чем i7 с диском 5400 об / мин (предположительно, с диском).bound).

Кроме того, это сильно зависит от вашего параллелизма: в вашем эксперименте не было параллелизма, что является наилучшим вариантом для транзакции.Повторная попытка из 100 потоков в Parallell может дать разные результаты.

0 голосов
/ 16 февраля 2012

Не в общем.Это может быть любой фактор.Нет правила, что вставка без транзакции происходит ровно в 2 раза медленнее.

Фактор (в этом примере 2) связан с тем фактом, что если вы используете транзакции, все вставки выполняются одновременно.И, конечно, множество других факторов, с которыми нужно иметь дело (например, индексы).

...