I’m trying to find a way to do a conditional DELETE on an InnoDB table which contains millions of records, without locking it (thus not bringing the website down).
I’ve tried to find information on mysql.com, but to no avail. Any tips on how to proceed?
I don’t think it is possible to delete without locking. That said, I don’t think locking the record you want to delete is a problem. What would be a problem is locking other rows.
I found some information on that subject here: http://dev.mysql.com/doc/refman/5.0/en/innodb-locks-set.html
What I would suggest, is to try and do a million single row deletes. I think that if you do all those in a single transaction, performance should not hurt too much. so you would get something like:
You can generate the required statments by doing something like
So the advantage over this method instead of doing:
is that in the first approach you only ever lock the record you’re deleting, whereas in the second approach you could run the risk of locking other records that happen to be in the same range as the rows you are deleteing.