Я считаю, что столкнулся с проблемой масштабирования базы данных. У меня есть таблица с почти миллионом строк, и наше приложение rails, кажется, зависает всякий раз, когда мы пытаемся создать новый экземпляр. Я заметил, что это также происходит, когда мы уничтожаем запись. Однако поиск и обновление происходят очень быстро.
Вот некоторая информация о таблице:
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
| instances | InnoDB | 10 | Compact | 972380 | 1897 | 1845493760 | 0 | 152846336 | 0 | 922976 | 2009-03-04 18:34:07 | NULL | NULL | latin1_swedish_ci | NULL | | InnoDB free: 5120 kB |
А также:
+-------------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| card_id | int(11) | YES | MUL | NULL | |
| email_id | int(11) | YES | MUL | NULL | |
| name | varchar(255) | YES | | NULL | |
| subject | varchar(255) | YES | | NULL | |
| prototype | text | YES | | NULL | |
| forwards_count | int(11) | YES | | 0 | |
| recipients_count | int(11) | YES | | 0 | |
| sent_at | datetime | YES | MUL | NULL | |
| created_at | datetime | YES | | NULL | |
| body | text | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
| original_id | int(11) | YES | | NULL | |
| saved | tinyint(1) | YES | | 1 | |
| notify_on_receipt | tinyint(1) | YES | | 0 | |
| total_views | int(11) | YES | | 0 | |
| total_sends | int(11) | YES | | 0 | |
| public | tinyint(1) | YES | MUL | 0 | |
| approved | tinyint(1) | YES | MUL | 0 | |
| sender_copy | int(11) | YES | | NULL | |
| recipient_base64 | varchar(255) | YES | | NULL | |
| user_generated_video_id | int(11) | YES | | NULL | |
| title | varchar(255) | YES | | NULL | |
| position | int(11) | YES | | NULL | |
| messages | text | YES | | NULL | |
+-------------------------+--------------+------+-----+---------+----------------+
Мне интересно, есть ли что-нибудь, что я могу попытаться изучить для дальнейшей диагностики проблемы. Или конфигурации, которые я должен попытаться изменить как возможные решения. По сути, поиск или обновление занимают около 8–12 мс, но выполнение оператора create или destroy займет более 10 секунд.
Вероятно, это связано с тем, что индексы необходимо обновлять при создании или удалении строки. Возможно, вы могли бы изучить %wa
по результатам top
во время медленных периодов и посмотрите, не тормозит ли вас жесткий диск. Конечно, это также может быть связано с плохой оптимизацией конфигурации mysql.
Думаю, причина может быть в ключах, которые вы здесь не показываете. Обновление нескольких ключей может занять некоторое время, и их не нужно обновлять при ОБНОВЛЕНИИ, если не изменять эти столбцы также при операциях только для чтения.
Ваш индекс составляет почти 10% от размера таблицы, что нужно переписывать при каждом обновлении таблицы, и это действительно занимает некоторое время.
Так что попробуйте уменьшить количество ключей до разумного количества.