![]() |
|
Модераторы: skyboy |
![]()
|
|
| maxipub |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: 1 Всего: 1 |
Добрый день!
Кому-то мои вопросы могут опять показаться незначительными. Ребята, мне в первую очередь просто интересно для себя знать! Итак, поехали. Есть таблица с юзерами, 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 подобных запросов в день. Не то чтобы капец, но зачем, из-за такой мелочи то!? Лучше повозиться и перенести конфирмкоды в отдельную таблицу, где их просто удалять? Или не стоит на это обращать внимание? |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
в myisam файл данных может иметь свободные блоки (в т.ч. в середине), которые могут использоваться повторно; смежные объединяются в один. это возможно за счет использования внешнего индексного файла.
у вас файл 30М весит, это почти ничего по нынешним меркам. не мешайте базе работать. |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
А ты хотя бы понимаешь, что такое фрагментация? в терминах phpmyadmin...
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
maxipub, если вас все еще беспокоят пустые поля кодов, вынесите их в отдельную таблицу
|
|||
|
||||
| maxipub |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: 1 Всего: 1 |
Т.е. они просто останутся свободными, пока не найдется подходящая инфа для записи туда? Если так, то эта инфа должна быть только из соседней записи, или туда впихнется любая, подходящая по размеру? |
|||
|
||||
| Akina |
|
||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Если не будет превышен предел доли свободного пространства в блоке. Иначе будет выполнено перераспределение.
При наличии кластерного индекса - нет. Иначе - возможно, да (см. системную переменную concurrent_insert). Поскольку у тебя MyISAM - однозначно второе. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
| maxipub |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: 1 Всего: 1 |
Получается, данные физически в файле будут храниться вперемешку, а не последовательно, и ориентиром на них будет просто индекс?
|
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Эммм... http://dev.mysql.com/doc/refman/5.6/en/myi...age-engine.html читать не пробовал? там много чего забавного.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| maxipub |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: 1 Всего: 1 |
Речь об этом? |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Ну и об этом тоже - но в десятую очередь...
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| maxipub |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: 1 Всего: 1 |
Понятно... Мне маны по MySQL даются туго, без примеров. Ну, в общем вопрос решен. Пока не буду париться об этом, а как нечего будет делать, повыношу в отдельные таблицы.
Спасибо! |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |