sql >> Database >  >> RDS >> Mysql

MySQL:Waarom is DELETE CPU-intensiever dan INSERT?

Met InnoDB (en ik hoop dat ze je hierin hebben), heb je tenminste meer bewerkingen zelfs zonder externe sleutels . Een insert is ongeveer dit:

  1. Rij invoegen
  2. Mark in binaire logbuffer
  3. Bevestiging markeren

Verwijderingen doen het volgende:

  1. Rij als verwijderd markeren (dezelfde treffer nemen als invoeging -- pagina is herschreven)
  2. Mark in binaire logbuffer
  3. Mark toegewijd
  4. Ga eigenlijk de rij verwijderen (dezelfde hit nemen als een invoeging -- pagina wordt herschreven)
  5. Purge thread houdt ook verwijderingen in binaire logbuffer bij.

Daarvoor heb je twee keer zoveel werk om te verwijderen in plaats van in te voegen. Een verwijdering vereist die twee schrijfbewerkingen omdat het moet worden gemarkeerd als verwijderd voor alle toekomstige versies, maar kan alleen worden verwijderd als er geen transacties meer zijn die het zien. Omdat InnoDB alleen volledige blokken naar de schijf schrijft, is de wijzigingsstraf voor een blok constant.



  1. Databaseontwerp voor controlelogboekregistratie

  2. PostgreSQL-updates met meerdere rijen in Node.js

  3. mysql-datumlijst met telling, zelfs als er geen gegevens zijn op een specifieke datum

  4. MySqlParameter als TableName