Форум сайта python.su
Всем привет.
Исспользую sqlalchemy для управления базой MySQL. База на том же компьютере, где выполняется скрипт
0. Для подключения как в примере вызываю create_engine( “mysql://localhost/dbname” ). Не вызывает ли это некую эмуляцию передачи по сети, которая замедляет суммарную резвость передачи? Нету ли других возможностей подключения напрямую?
1. Намного ли быстрее ли добавлять данные из списка одним вызовом insert и передачей ему этого списка, чем просто в цыкле по списку вызывать insert для каждого элемента?
Проверял ли кто?
Офлайн
Через localhost - значит через loopback интерфейс. Исключительно программный. Издержки поизводительности пренебирежимо малы.
Производительность добавляют транзакции.
Всунь цикл в транзакцию - и получишь отличную скорость.
Проверял. Тормоза Питона на цикл опять же пренебрежимо малы в этом случае.
Офлайн
Андрей СветловОно все равно не через loopback идет. Клиентская библиотека mysql самостоятельно заменяет соединение на unix socket если подключение через localhost.
Через localhost - значит через loopback интерфейс.
wNomadПро транзакции уже написали. Еще важный момент - использовать параметризованный запрос, чтобы сервер не нагружать prepare запроса для вставки каждой записи. Хотя, возможно, mysqldb умеет самостоятельно преобразовывать запросы в параметризованные, не знаю…
Намного ли быстрее ли добавлять данные из списка одним вызовом insert и передачей ему этого списка, чем просто в цыкле по списку вызывать insert для каждого элемента?
Офлайн
OlDerСпасибо, что поправили. Но, по моему, что в лоб, что по лбу. Т.е. все равно - очень быстро.
Оно все равно не через loopback идет. Клиентская библиотека mysql самостоятельно заменяет соединение на unix socket если подключение через localhost.
OlDerКажется, самостоятельно никто толком не умеет. Действительно ценное дополнение. Только вопрос один. Сервер нагружается или клиент?
Про транзакции уже написали. Еще важный момент - использовать параметризованный запрос, чтобы сервер не нагружать prepare запроса для вставки каждой записи. Хотя, возможно, mysqldb умеет самостоятельно преобразовывать запросы в параметризованные, не знаю…
Офлайн
Спасибо за ответы.
Еще маленький вопрос. Для того, чтобы использовать транзакции, нужно ли перевести таблицу с MyISAM на InnoDB?
Офлайн
Угу
Офлайн
Последний ньюбский вопрос по базам:
Ничего страшного, если переведу базу на движок с поддержкой транзакций, и в многопоточном приложении один поток будет к базе обращаться по старинке без сессий/транзакций, как и было до этого, а тот, который с низкой производительностью, будет переведен на этот более быстрый механизм?
Офлайн
Я привык рассматривать вопрос просто. Если без транзакций - то каждый запрос оформляется как отдельная транзакция. AUTOCOMMIT. Ничего страшного не происходит. Если транзакции есть - COMMIT выполняется вручную. Если есть поддержка XA транзакций, они же двухпроходные - транзакцию можно контроллировано выполнять работая с несколькими базами как с единой системой.
Не являюсь гуру в базах данных. Может, спецы укажут на список тонких моментов. Но для моих разработок этот подход срабатывал :)
Офлайн