Изтриването на данни от InnoDB е най-скъпата операция, която можете да поискате от него. Както вече открихте, самата заявка не е проблем - повечето от тях така или иначе ще бъдат оптимизирани за същия план за изпълнение.
Въпреки че може да е трудно да се разбере защо DELETE от всички случаи са най-бавни, има доста просто обяснение. InnoDB е машина за съхранение на транзакции. Това означава, че ако заявката ви бъде прекъсната по средата, всички записи ще останат на мястото си, сякаш нищо не се е случило. След като приключи, всичко ще изчезне в същия миг. По време на DELETE други клиенти, свързващи се със сървъра, ще виждат записите, докато изтриването завърши.
За да постигне това, InnoDB използва техника, наречена MVCC (Multi Version Concurrency Control). Това, което по същество прави, е да даде на всяка връзка изглед на моментна снимка на цялата база данни, както е било, когато е започнало първото изявление на транзакцията. За да се постигне това, всеки запис в InnoDB вътрешно може да има множество стойности - по една за всяка моментна снимка. Това е и причината БРОЕТО в InnoDB отнема известно време - зависи от състоянието на моментната снимка, което виждате в този момент.
За вашата транзакция DELETE всеки запис, който е идентифициран според условията на вашата заявка, се маркира за изтриване. Тъй като други клиенти може да имат достъп до данните по едно и също време, той не може незабавно да ги премахне от таблицата, тъй като те трябва да видят съответната моментна снимка, за да гарантират атомарността на изтриването.
След като всички записи са маркирани за изтриване, транзакцията се извършва успешно. И дори тогава те не могат да бъдат незабавно премахнати от действителните страници с данни, преди всички други транзакции, които са работили със стойност на моментна снимка преди вашата транзакция DELETE, също да са приключили.
Така че всъщност вашите 3 минути не са толкова бавни, като се има предвид факта, че всички записи трябва да бъдат променени, за да се подготвят за премахване по безопасен за транзакция начин. Вероятно ще "чуете" вашия твърд диск да работи, докато се изпълнява изявлението. Това се причинява от достъп до всички редове. За да подобрите производителността, можете да опитате да увеличите размера на буферния пул на InnoDB за вашия сървър и да опитате да ограничите друг достъп до базата данни, докато ИЗТРИВАТЕ, като по този начин също така намалявате броя на историческите версии, които InnoDB трябва да поддържа за запис. С допълнителната памет InnoDB може да успее да прочете вашата таблица (предимно) в паметта и да избегне известно време за търсене на диск.