Подтвердить что ты не робот

Mysql Slow Insert

У меня есть следующая таблица InnoDB:

+-----------+-----------+------+-----+-------------------+----------------+
| Field     | Type      | Null | Key | Default           | Extra          |
+-----------+-----------+------+-----+-------------------+----------------+
| id        | int(11)   | NO   | PRI | NULL              | auto_increment |
| doc_id    | char(32)  | NO   |     | NULL              |                |
| staff     | char(18)  | NO   |     | NULL              |                |
| timestamp | timestamp | NO   | MUL | CURRENT_TIMESTAMP |                |
+-----------+-----------+------+-----+-------------------+----------------+

С помощью этих клавиш:

+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table        | Non_unique | Key_name        | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| staff_online |          0 | PRIMARY         |            1 | id          | A         |      277350 |     NULL | NULL   |      | BTREE      |         |
| staff_online |          1 | timestamp       |            1 | timestamp   | A         |      277350 |     NULL | NULL   |      | BTREE      |         |
| staff_online |          1 | staff_timestamp |            1 | timestamp   | A         |      277350 |     NULL | NULL   |      | BTREE      |         |
| staff_online |          1 | staff_timestamp |            2 | staff       | A         |      277350 |     NULL | NULL   |      | BTREE      |         |
+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

Я только заметил, что in mysql-slow.log у меня иногда есть запрос INSERT в этой таблице, который занимает более 1 секунды

INSERT INTO `staff_online` (`doc_id`, `staff`, `timestamp`) VALUES ('150b60a0ab8c5888bdbbb80bd8b7f8a2', 'asia', '2011-01-29 16:52:54')

Я действительно озадачен, почему это так долго. Как я могу ускорить его?

Кстати: каждый день есть ~ 80 медленных INSERTS и 40 медленных UPDATES, таких как.

4b9b3361

Ответ 1

Иногда это не сам запрос вызывает замедление - другой запрос, работающий в таблице, может легко привести к замедлению вставки из-за изоляции транзакций и блокировки. Ваши медленные запросы могут просто ждать завершения других транзакций. Это довольно часто встречается в занятой таблице, или если ваш сервер выполняет длинные/сложные транзакции.

Другим важным фактором будет общая производительность вашей базы данных: как настроен ваш файл my.cnf, как настроен сам сервер, что еще работает на нем, и, конечно же, какое оборудование работает на сервере.

Инструмент linux mytop и запрос SHOW ENGINE INNODB STATUS\G могут быть полезны для просмотра возможных проблемных мест. Общие инструменты производительности Linux также могут показывать, насколько заняты ваши диски и т.д.

Учитывая характер этой таблицы, рассмотрели ли вы альтернативный способ отслеживания того, кто в сети? В MySQL я использовал таблицу MEMORY для таких целей в прошлом. Для этого типа информации может быть полезно хранилище данных NoSQL. Redis может хранить это как отсортированный набор с большим успехом (оценка == timestamp).

Дальнейшее чтение:

Ответ 2

Есть 277259 строк, и только некоторые вставки медленны (редко)

Всякий раз, когда страница B-Tree заполняется, ее необходимо разбить, что занимает некоторое время. Вставка производительности также медленнее, чем больше индексов, так как каждая вставка обновляет все индексы. 9000 уже правильно указал, что ваш индекс (timestamp, staff) охватывает индекс временной отметки в 95% случаев, есть очень редкие случаи, когда для повышения производительности требуется индекс с одной колонкой (timestamp).

Есть также некоторые периодические фоновые задачи, которые могут иногда замедлять вставку или два в течение дня.

Кроме того, другой причиной задержки является просто активность базы данных. Если у вас есть транзакции, которые блокируют страницы, которые требуется вставить для обновления (или разбиение на страницы), вставка должна ждать, пока блокировки записи не будут приняты. Этим другим действиям даже не нужно фактически начинать транзакцию, и им даже не нужно читать утверждение о чтении; вы также можете иметь право на запись-запись или очередь, созданную из тяжелой активности.

И последняя возможная причина - у вашего сервера базы данных нет ресурсов, будь то память или процессор или сетевой ввод-вывод. Существует так много всего сервера, поэтому ему придется подождать, пока у него не будет достаточно ресурсов.

Ответ 3

Если вы вставляете в таблицу в больших плотных пакетах, может потребоваться некоторое время для ведения домашнего хозяйства, например. чтобы выделить больше места для таблицы и индексов.

Если вы не хотите, чтобы ваше приложение ждало, попробуйте использовать INSERT DELAYED, хотя оно имеет свои недостатки.

Ответ 5

Если вы используете back-level при установке MySQL, мы заметили много такого замедления при использовании версии 4.1.

Ответ 6

Как мой опыт производительности InnoDB ниже, чем MyISAM.
Попробуйте вместо этого использовать MyISAM? Или, может быть, вам нужно настроить конфигурацию InnoDB: http://dev.mysql.com/doc/refman/5.0/en/innodb-configuration.html
Надеюсь, что поможет.