Kažkas blogai.
Kiek ID paprastai būna nurodyta, IN() sąlygoje?
Aš pabandyčiau daryti taip: turėčiau susikūręs specialią lentelę, kurioje būtų surašyti reikiami trinti ID. Tarkim prieš trinimo operaciją, ta lentelė yra išvaloma (TRUNCATE) ir į ją suINSERTinami nauji ID.
Turint tokią lentelę galima daryti trinimą naudojant lentelių sujungimą išvengiant IN() operatoriaus. čia aišku su sąlyga, kad tas ID abiejuose lentelėse tikrai yra indeksas ir jis yra naudojamas. (nes gali būt, kad pas tave jis nenaudojamas, o naudojamas kažkuris kitas, indeksas, kuris nepadengia būtent to ID).
Ar naudojamas indeksas, ir kaip naudojamas, gali pasižiūrėt DELETE komandą pakeitęs į EXPLAIN EXTENDED SELECT, pvz.:
EXPLAIN EXTENDED SELECT * FROM lentele WHERE indexas IN (5,6,7,8.... )
Kaip trinti iš vienos lentelės, bet atrenkand duomenis pagal kitos lentelės ID: http://dev.mysql.com/doc/refman/5.0/en/delete.html
Taip pat yra svarbu, kad tu naidoji MyISAM, kuriame realiai operacijos užrakina (LOCK) visą lentelę, todėl jeigu pas tave toje lentelėje trinimo metu vyksta intensyvus skaitymas tai tas stipriai prisideda prie operacijos lag'o. Reikėtų paeksperimentuoti, kiek tokiu atveju padėtų InnoDB naudojimas, kur UPDATE/DELETE rakina konkrečias eilutes.
Dar kitas svarbus dalykas - kiek iš viso tu toje lentoje turi index'ų. Blogai jeigu daug. Nes trinimo metu visi indeksai yra modifikuojami. Idealiu atveju turėtų būti vienas indeksas (pvz PRIMARY), pagal kurį tu atlieki trinimo operaciją.
MySQL serverio konfigūracija irgi turi įtakos, bet čia jau sekantis aiškinimosi/konfigūravimo žingsnis po schemos/užklausų opetimizavimo.