Повечето от нас използват транзакциите на базите данни основно за дебъгинг, така че ако нещо се счупи, винаги имаш възможност да 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
Можете да си направите сами извода, но аз лично няма да пропусна шанс да ползвам транзакции, дори да не ми трябват за дебъгинг :)
Хубаво щеше да е и ако имаше разбиране 'защо'. А и традиционно транзакцията не се използва за 'дебъгинг', а за консистенсност на данните, но както и да е.
ОтговорИзтриванеПричината множество INSERTи да стават по-бързо в транзакция е, че всички неуникални индекси се записват еднократно при commit на транзакцията, а също и в по-малкия брой заключвания/отключвания, които се правят.
Още по-бързо разбира се е да се използва multi-insert (INSERT INTO ... VALUES (), (), () ...)