When and how would MyISAM concurrent insert = always be a problem? I wish to set concurrent_insert to always on a MyISAM log table, so that inserts wouldn't have to wait for selects to perform when there are some holes in the table.

We're talking about 10-20 inserts per second and quite rare but yet some selects on the log that could take around 10s. I don't want my 100-200 inserts wait for these selects.

My question is quite simple actually. Taken aside the hole not-always-being-filled concern, when and how would it do any harm ?

Nota Bene: I wouldn't use DELAYED INSERT as they are of the INSERT ... ON DUPLICATE KEY UPDATE form.
The only immediate harm I can think of is dealing with contention from the UPDATE.

Normal INSERT, UPDATE, and DELETE commands execute a full table lock. Doing ON DUPLICATE KEY UPDATE should work the same.

In addition, what if the row's size changes to the point that the row needs to be bigger that the row's original allocation because of increasing the length of a VARCHAR column? That would require writing the row to a new part of the MyISAM table.

The only exception to this concern is when the MyISAM table


has no TEXT or VARCHAR fields
has no TEXT fields, has VARCHAR fields but ROW_FORMAT=Fixed


The MyISAM table would probably have some contention issues if you have TEXT fields because of the lack of length control or possible overflow of data to handle no matter what the table's ROW_FORMAT is set to.