сряда, 12 януари 2011 г.

MySQL транзакциите като форма на оптимизация?

Повечето от нас използват транзакциите на базите данни основно за дебъгинг, така че ако нещо се счупи, винаги имаш възможност да rollback-неш промените без да загубиш никакви данни.

Днес, гледайки един уебинар за Zend Framework + Doctrine 2, осъзнах че транзакцията освен за дебъгинг на евентуални възникнали проблеми могат да са и сериозна оптимизация на sql заявките.

Точно така - оптимизация.

Във уебинара имаше benchmark на insert на данни в база данни през EntityManager-а на Doctrine2 и с обикновенни mysql_query() заявки. При 20 завъртания на цикъла около тези insert-и, резултатите бяха следните:

Doctrine 2: 0.0094 секунди
mysql_query: 0.0165 секунди

Причината Doctrine2, макар да използва доста по-голямо количество код, да победи е, че там автоматично се използват транзакции. За да се докаже това твърдение, бяха показани резултати от същият benchmark, само че с употреба на транзакции при mysql_query().

Резултатите са повече от убедителни:

Doctrine 2: 0.0094 секунди
mysql_query: 0.0028

Можете да си направите сами извода, но аз лично няма да пропусна шанс да ползвам транзакции, дори да не ми трябват за дебъгинг :)

1 коментар:

  1. Хубаво щеше да е и ако имаше разбиране 'защо'. А и традиционно транзакцията не се използва за 'дебъгинг', а за консистенсност на данните, но както и да е.

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

    Още по-бързо разбира се е да се използва multi-insert (INSERT INTO ... VALUES (), (), () ...)

    ОтговорИзтриване