Назад | Перейти на главную страницу

База данных mySQL работает очень плохо при INSERT, DESTROY, но нормально при FIND и UPDATE

Я считаю, что столкнулся с проблемой масштабирования базы данных. У меня есть таблица с почти миллионом строк, и наше приложение 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% от размера таблицы, что нужно переписывать при каждом обновлении таблицы, и это действительно занимает некоторое время.

Так что попробуйте уменьшить количество ключей до разумного количества.