Ruby: увеличит ли использование Fibers мою пропускную способность для вставки БД?

0

В настоящее время я использую Ruby 1.9.1 и "ruby-mysql", который, в отличие от "mysql", написан только в рубине. На самом деле это довольно медленно, так как кажется, что он вставляется со скоростью почти 1 секунду (SLOOOOOWWWWWW). И у меня есть много вложений, чтобы сделать тоже, это в значительной степени то, что этот script делает с умом. Я использую только 1 соединение (поскольку я использую только один поток). Я надеюсь ускорить процесс, создав волокно, которое будет

  • создать новое соединение с БД
  • вставить 1-3 записи
  • закрыть соединение с БД

Я бы предположил, что запуск 20-50 из них значительно увеличит пропускную способность БД. Правильно ли я идти по этому маршруту? Я считаю, что это лучший вариант, в отличие от рефакторинга всего моего кода БД, поскольку синтаксис немного отличается для драйвера mysql по умолчанию: (

Теги:
multithreading

2 ответа

0
Лучший ответ

Поскольку вы используете ruby1.9.1, просто используйте Threads. Они больше не зеленые. Волокна не помогут, поскольку они слишком легки для нескольких одновременных соединений с БД.

0

Почему вы закрываете соединение после нескольких вставок? Ваш script должен быть:

  • Открыть соединение
  • Напишите, однако, много записей, которые вам нужны.
  • Закрыть соединение

Транзакции могут усложнить это.

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

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

В принципе, если одна вставка занимает секунду, она предлагает мне один или несколько из:

  • Внешние ключи не индексируются, поэтому проверка ссылочной целостности вставки крайне неэффективна; или
  • Чрезмерное открытие и закрытие соединения.

Теперь все, что сказано, наличие нескольких "рабочих", выполняющих вставки, может привести к полезному увеличению общей пропускной способности, но на 1 секунду на каждую вставку, это не ваша проблема. Вам нужно найти, в чем проблема.

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

  • 0
    Я никогда не говорил, что закрываю соединение после каждой вставки ... (что я не кстати). FK индексируются, это было по умолчанию из MySQL Workbench. Нет чрезмерного открытия / закрытия соединения. Это делается только один раз. Узкое место явно связано с драйвером ruby, поскольку это не оболочка C по умолчанию, а чистый драйвер ruby.
  • 0
    О, и в этом была транзакция, я вынул ее и заметил только очень незначительные улучшения. Полагаю, теперь, когда я думаю об этом, мне больше всего интересно, будут ли волокна Руби эффективными или такими же медленными. И я не думаю, что у ruby есть какая-либо поддержка пула потоков, что усложняет этот вид.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню