Добрый день!
Кому-то мои вопросы могут опять показаться незначительными. Ребята, мне в первую очередь просто интересно для себя знать! Итак, поехали.
Есть таблица с юзерами, 200к записей, 30Мб весит. В таблице есть такое поле:
`confirm_code` varchar(40) DEFAULT NULL
1.
Это код подтверждения email адреса, который высылается в письме при регистрации. Ну все знают такие штуки. Заполняется рандомом, при успешном подтверждении его значение устанавливается в NULL. Понятно, что при этом возникает фрагментация таблицы (смотрю через phpmyadmin). Но что мне интересно! По мере заполнения таблицы эта фрагментация "мигает". Т.е. кто-то подтвердил регистрацию - она возникла, кто-то новый зарегался - пропала. Как такое может быть? OPTIMIZE TABLE точно ни где нет, 100%. Просто я думал что в MyISAM дефрагментация таблицы сводится к ее блокировке, дампу, и дальнейшему полному восстановлению из дампа и снятия блокировки. Ведь если UPDATE происходит где-то в середине таблицы, оттуда вырезается 40 байт инфы, вставляется NULL - возникает дыра, на которую надо сдвинуть оставшуюся часть файла (или просто перезаписать его целиком заново). Вот не пойму, почему так происходит, чего фрагментация при вставке пропадает? Или перед INSERT принудительно вызывается OPTIMIZE TABLE? Вроде бы нет...
2.
Как в принципе лучше быть? Ставить OPTIMIZE TABLE после каждого UPDATE с confirm_code=NULL ? Просто это каждый раз перезапись 30Мб файл, да еще и блокировать на полсекунды... Прикидываю какая лишняя нагрузка на дисковую подсистему даже при 1000 подобных запросов в день. Не то чтобы капец, но зачем, из-за такой мелочи то!? Лучше повозиться и перенести конфирмкоды в отдельную таблицу, где их просто удалять? Или не стоит на это обращать внимание? |