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

Как оптимизировать вставку mysql с помощью Perl?

У меня есть парсер журналов в perl, и он использует команду mysql insert или update в каждой строке. Подобно:

Log line 1: 2012-12-01 12:12 [perld] Hello world #1
....
Log line N: 2012-12-01 12:NN [perld] Hello world #N

Он анализирует эти строки, получает «отметку времени» и «#N» и вставляет их в базу данных mysql (анализирует строку с помощью функции perl :: tail).

У меня около 100 строк в секунду, так что в mysql будет около 100 вставок.

Есть ли какое-нибудь решение / алгоритм для оптимизации? А может мне стоит использовать что-то вроде буфера со вставкой?

Вот несколько моментов, которые вы можете проверить. Вы можете попробовать хранимые процедуры (подготовленные операторы). Это можно реализовать с помощью метода dbi-> prepare в Perl. Обычно это быстрее, чем выполнять один и тот же запрос несколько раз, поскольку вам нужно отправлять только параметры.

Вы также можете попробовать объединить несколько статусов вставки в один и выполнить их как один оператор.

Кроме того, вы можете попробовать MyISAM, если вы еще не используете его. Это быстрее, чем InnoDB. Вы можете попробовать, если не используете транзакции.

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

Кроме того, уверены ли вы, что ваш sql - это то, что требует времени - как говорит Халед, вам может быть полезно предварительно подготовить запрос, но могут быть и другие места, где все работает медленно - например, вы говорите, что анализируете дату - возможно с Date :: Manip делается легко - но не быстро! Перед тем как начать, убедитесь, что знаете, где нужно оптимизировать :)

MySQL поддерживает многострочную вставку, например:

INSERT INTO sometable (field1, field2) VALUES
(1, 2),
(2, 3),
(3, 4);

и т. д. Вы можете делать одну вставку в секунду после анализа всех строк за эту секунду или (лучше) разрешить установку порога во время выполнения, что позволит вам выяснить настройки производительности путем экспериментов.