Не мог удержаться и провел очень простой эксперимент.
Создал MyISAM табличку и провел серию DML (insert/update/delete).
После выполнения каждого запроса смотрел содержимое файла MYD.
Любой может проделать это.
mysql> create table a(id int(11),name text);
Query OK, 0 rows affected (0.04 sec)
//Файл пустой (размер 0 байт)
mysql> insert into a values (1,'1111111111111111111111');
Query OK, 1 row affected (0.00 sec)
//В начале файла появились единички (36 байт)
mysql> insert into a values (2,'2222222222222222222222');
Query OK, 1 row affected (0.00 sec)
//В конец файла дописаны двоечки (72 байт)
mysql> update a set name = '333333333333333333333333333333333333333333333333333333333' where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
//Единички пропали и часть троек заняли их место, а часть дописалась в конец файла.
//Значит у нас есть константа - начальный адрес строки который не меняется в течение ее жизни.
//При выборке такой строки будут сделаны дополнительные движения.
//Такое поведение мы наблюдаем и в Oracle. Называется row chain.
mysql> update a set name = '4444444444' where id = 2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
//Двойки пропали на из место записаны четверки.
//Четверок меньше - остальное место записано нулями.
mysql> update a set name = '5555555555555555555555' where id = 2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
//Пятерок столько же сколько и было двоек.
//Они легли точно на их место.
mysql> delete from a where id = 2;
Query OK, 1 row affected (0.00 sec)
//На месте части пятерок появились FF
mysql> insert into a values (2,'2222222222222222222222');
Query OK, 1 row affected (0.00 sec)
//FF и остатки пятерок записаны двойками.
mysql> delete from a where id = 2;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into a values (2,'77777777777777777777777777777777777777777777777777');
Query OK, 1 row affected (0.00 sec)
//Все двойки стерты, а семерочный хвост дописан в конец файла.
Надо отметить, что размер файла менялся только при первых 3-запросах.
Итого: реальный вред могут приносить update'ы увеличивающие длину строки.
И вставки новых данных, также приводят в фрагментации на уровне строк,
но только в случае предварительного удаления данных.
Это скажется и на выборке и на последующих обновлениях данных.
Выводы: для MyISAM таблиц требуется регулярная дефрагментация.
За исключением приложений в которых отсутствуют update(полей с переменной длиной) и delete.
Создал MyISAM табличку и провел серию DML (insert/update/delete).
После выполнения каждого запроса смотрел содержимое файла MYD.
Любой может проделать это.
mysql> create table a(id int(11),name text);
Query OK, 0 rows affected (0.04 sec)
//Файл пустой (размер 0 байт)
mysql> insert into a values (1,'1111111111111111111111');
Query OK, 1 row affected (0.00 sec)
//В начале файла появились единички (36 байт)
mysql> insert into a values (2,'2222222222222222222222');
Query OK, 1 row affected (0.00 sec)
//В конец файла дописаны двоечки (72 байт)
mysql> update a set name = '333333333333333333333333333333333333333333333333333333333' where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
//Единички пропали и часть троек заняли их место, а часть дописалась в конец файла.
//Значит у нас есть константа - начальный адрес строки который не меняется в течение ее жизни.
//При выборке такой строки будут сделаны дополнительные движения.
//Такое поведение мы наблюдаем и в Oracle. Называется row chain.
mysql> update a set name = '4444444444' where id = 2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
//Двойки пропали на из место записаны четверки.
//Четверок меньше - остальное место записано нулями.
mysql> update a set name = '5555555555555555555555' where id = 2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
//Пятерок столько же сколько и было двоек.
//Они легли точно на их место.
mysql> delete from a where id = 2;
Query OK, 1 row affected (0.00 sec)
//На месте части пятерок появились FF
mysql> insert into a values (2,'2222222222222222222222');
Query OK, 1 row affected (0.00 sec)
//FF и остатки пятерок записаны двойками.
mysql> delete from a where id = 2;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into a values (2,'77777777777777777777777777777777777777777777777777');
Query OK, 1 row affected (0.00 sec)
//Все двойки стерты, а семерочный хвост дописан в конец файла.
Надо отметить, что размер файла менялся только при первых 3-запросах.
Итого: реальный вред могут приносить update'ы увеличивающие длину строки.
И вставки новых данных, также приводят в фрагментации на уровне строк,
но только в случае предварительного удаления данных.
Это скажется и на выборке и на последующих обновлениях данных.
Выводы: для MyISAM таблиц требуется регулярная дефрагментация.
За исключением приложений в которых отсутствуют update(полей с переменной длиной) и delete.