Заполняются ли отверстия MyISAM автоматически? - PullRequest
2 голосов
/ 28 мая 2010

Когда вы запускаете удаление в таблице MyISAM, она оставляет отверстие в таблице, пока таблица не будет оптимизирована.

Это влияет на одновременные вставки. При настройке по умолчанию concurrent_inserts работает только для таблиц без отверстий. Однако в документации к MyISAM в разделе concurrent_insert говорится:

Включает одновременные вставки для всех таблиц MyISAM, даже тех, которые имеют отверстия. Для таблицы с отверстием новые строки вставляются в конец таблицы, если она используется другим потоком. В противном случае MySQL получает обычную блокировку записи и вставляет строку в отверстие.

http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_concurrent_insert

Значит ли это, что MyISAM автоматически заполняет отверстия, когда в таблицу вставляется новая строка? Ранее я думал, что отверстия не будут исправлены, пока вы не оптимизируете стол.

Ответы [ 2 ]

1 голос
/ 28 мая 2010

Вставки в середину стола требуют блокировки. Таким образом, в настройках по умолчанию MySQL предпочтет заполнить дыры, даже если это предотвратит одновременные вставки.

Так что, да, MySQL предпочитает заполнять дыры.

Если для параметра concurrent_inserts задано значение 2, MySQL сообщает, что, если в таблице есть блокировка, вставьте в конец, что не требует блокировки, даже если есть еще отверстия для заполнения. Таким образом, это позволяет выполнять одновременные вставки, даже если в середине есть отверстия, за счет того, что для их заполнения требуется больше времени.

1 голос
/ 28 мая 2010

Да, в таблицах MyISAM повторно используется удаленное / свободное пространство (не верно ли это для всех случаев).

Это легко заметить, удалив несколько записей и вставив новую - файл данных MyISAM для этой таблицы не увеличится в размере.

...