2011-01-29 2 views
12

У меня есть следующий InnoDB таблицы:Mysql Slow Вставка

+-----------+-----------+------+-----+-------------------+----------------+ 
| 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 я иногда запрос ВСТАВИТЬ на этой таблице, которая занимает более 1 второй

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

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

BTW: Каждый день есть ~ 80 медленных INSERTS и 40 медленных ОБНОВЛЕНИЙ, подобных этому.

+1

Сколько строк в таблице, и вы уверены, что все вставки медленные? –

+1

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

+7

Кажется, у вас есть два индекса: один - «timestamp» другой - «timestamp, staff». Последнее достаточно для поиска по 'timestamp', вы можете отказаться от первого. – 9000

ответ

10

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

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

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

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

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

+1

Я добавил следующее в мою конфигурацию mysql, чтобы получить мне больше производительности. Посмотрим. innodb_flush_log_at_trx_commit = 0 innodb_support_xa = 0 innodb_buffer_pool_size = 536870912 – kalkin

+0

Btw я не могу использовать двигатель памяти, потому что мне нужно иметь оперативные данные в какой-то постоянной образом, для последующего анализа. – kalkin

+0

@Kalkin: Это звучит как повод для меня - «требования бизнеса требуют этого». Иногда чрезмерно широкие требования к бизнесу необходимо переоценивать перед лицом технических препятствий. Я бы посоветовал переосмыслить ваши требования на основе того, что вам действительно нужно знать. Но в целом, мой пост посвящен: не просто посмотрите на этот один запрос, посмотрите на все, что делает ваша база данных. Мы не знаем, что это такое, поэтому мы можем только помочь. – wuputah

-3

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

4

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

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

+4

INSERT DELAYED, похоже, является хорошим решением проблемы, но это не работает на InnoDB :( – kalkin

+0

Он также устарел в 5.6.6 и удален в 5.7. – TJChambers

12

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

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

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

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

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

+0

I упал индекс временной отметки. Мы увидим, исчезнут ли медленные вставки .. – kalkin

+0

@kalkin - это один из факторов, как указано выше, но не только * *. Извлечение его в одиночку будет * не * заставлять медленные вставки исчезать, но это, безусловно, хорошая идея. В системах хранения данных, таких как InnoDB, есть фоновые задачи, которые могут периодически замедлять вставку или два. Другие факторы, такие как автоматическое резервное копирование (MySQL), снимки полного образа (резервное копирование сервера), разделение страниц и т. д., также могут вызывать редкие задержки – RichardTheKiwi

+0

Большинство задержек вставки - это когда в нашем «часовом часе» есть партия трафика. – kalkin

1

Если вы работаете в среде кластера, столбцы с автоматическим увеличением могут замедлять вставки. Попробуйте выполнить настройку ndb_autoincrement_prefetch_sz (см. http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-system-variables.html#sysvar_ndb_autoincrement_prefetch_sz)

+0

Нет кластерной среды, но в любом случае спасибо за подсказку. – kalkin

1

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