LINUX.ORG.RU

MySQL, ассинхронный python-клиент, медленный SELECT

 , ,


0

3

Для примера, такой запрос:

SELECT column_1, column_2 FROM table
WHERE
    created > '2016-01-05 23:59:59'
AND
    created < '2016-02-06 00:00:00';

Результат ~2.5KK строк, а по времени:

  • mysql - ~2 сек;
  • python-клиент на mysqlclient (форк MySQLdb) - ~ 3.5 сек.;
  • python-клиент на aiomysql (внутри PyMySQL) - ~ 40 сек.

В общем, как в присказке про рыбку и пароход, хочется ассинхронности и быстрых запросов.

Кто aiomysql использует, это возможно?

UPDATE. Господа, вопрос не про ассинхронность в mysql, и не про ОРМ. А про то, что коннектор, который использует aiomysql сам по себе работает в 10 раз медленнее, чем можно. Весь вопрос, есть возможность поменять коннектор в aiomysql или нет, и как выход остается смотреть в сторону ThreadPoolExecutor или aioodbc.

UPDATE 1. aioodbc и ThreadPoolExecutor мне в помощь.

★★★★★

Последнее исправление: vvn_black (всего исправлений: 2)

Точно стоит начать с индекса у поля created.

nikolnik ★★★
()

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

nikolnik ★★★
()
Ответ на: комментарий от nikolnik

Я вас попрошу всё-таки ещё раз перечитать топик. Один и тот же запрос, но разные питоновские «коннекторы», один выбирает за 3.5 секунды, второй, тот что использует aiomysql - за 40 секунд.

Асинхронность, кстати, не заставит запрос выполняться быстрее ну никак.

Мне не нужно ничего ускорять, хочется чтобы aiomysql тупил не так сильно, не в 10 раз.

Речь про тупость PyMySQL по сравнению с mysqlclient, и желание ассинхронного mysqlclient.

vvn_black ★★★★★
() автор топика
Ответ на: комментарий от vvn_black

Я вас попрошу всё-таки ещё раз перечитать
хочется чтобы aiomysql тупил не так сильно, не в 10 раз.

Медленность выполнения запроса в питоне связана из-за оверхеда при сериализации результата в питоновский объект. Победить это можно только использованием менее тормозной орм

nikolnik ★★★
()
Ответ на: комментарий от nikolnik

Победить это можно только использованием менее тормозной орм

Какой-такой ОРМ, у вас ОРМ без коннекторов работает? Разница в выполнении запроса на уровне коннекторов.

vvn_black ★★★★★
() автор топика
Ответ на: комментарий от Hater

Приведи код использования этих либин, который ты использовал для тестов.

Что там может быть интересного?

mysqlclient:

import MySQLdb

db = MySQLdb.connect(...)
with db.cursor() as cursor:
    cursor.execute(query)
    cursor.fetchall()
db.close()

[Finished in 3.7s]

PyMySQL:

import pymysql

db = pymysql.connect(...)
with db.cursor() as cursor:
    cursor.execute(query)
    cursor.fetchall()
db.close()

[Finished in 37.2s]

Я уже смотрю в сторону ежа-с-ужиком - ThreadPoolExecutor

vvn_black ★★★★★
() автор топика
Ответ на: комментарий от vvn_black

Как у вас ОРМ-то работает? Может он перед запросом все метаданные всасысавает с СУБД. Посмотрите чего он там делает все это время.

alozovskoy ★★★★★
()
Ответ на: комментарий от fluorite

Так где у тебя затык-то, в connect(), execute() или fetchall() ?

execute()

vvn_black ★★★★★
() автор топика

MySQL, в отличие от Postgres не поддерживает асинхронность на уровне драйвера, так что вся асинхронность эмулируется оберткой для asyncio (для twisted аналогично)

Yur4eg ★★
()

голосую за ThreadPoolExecutor, по-моему, нормальное решение.

PS спасибо что запостил баг. Лучше им прислать куски кода которые бы мэйнтейнеры могли у себя тупо запустить, не думая как им создать test conditions.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Я уже aioodbc поднял, вроде воркает. И ThreadPoolExecutor тоже попробую.

Лучше им прислать куски кода которые бы мэйнтейнеры могли у себя тупо запустить.

Дык, всё из их же example.

vvn_black ★★★★★
() автор топика

я использую pymysql как обертку (для совместимости со старым кодом, завязанным на mysqldb) + ultramysql(самая быстрая, из тех что пробовал) + gevent (для асинхронности).

genryRar ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.