Выполнение Python MySQLdb заняло так много времени - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть SQL-запрос, который является просто запросом множественного выбора.Когда я запускаю его в скрипте Python с выполнением MySQLdb, он тратит 11-12 секунд, однако, когда я запускаю тот же запрос на странице phpMyAdmin или в интерфейсе mysql, он возвращает через 0,3 секунды.

Странная часть для меня, когдаЯ выполняю тот же SQL-запрос в значительно меньшей базе данных (более крупная имеет 150M строк, меньшая имеет 3M строк), время выполнения уменьшается до 10-11 секунд, и снова, когда я выполняю тот же запрос в phpMyAdmin, это занимает всего 0,2-0,3 секунды.,

Я попытался изменить тип курсора на SSCursor, однако это сокращает время запроса, но увеличивает время выборки, чтобы общее время не изменилось.

Я пытался изменить тип обработчика таблицы на MEMORY,однако моя таблица не содержит временных значений.

Я добавил тонны конфигураций в файл my.cnf mysql, но они ничего не изменили.Сейчас я сохраняю только параметр innodb_buffer_pool_size = 12G, поскольку у меня 16 ГБ ОЗУ на моем компьютере.

Вот запрос, который я использую:

SELECT HEX(hash), song_id, offset FROM fingerprints WHERE hash IN 
(UNHEX("970BEC39E461E0C16150")...);

внутри последней части 1000 значений Hex,Вот результат EXPLAIN этого запроса: EXPLAIN QUERY

Вот часть, где запрос работает на python:

with self.cursor(charset="utf8") as cur:
        for split_values in grouper(values, 1000):
            # Create our IN part of the query
            query = self.SELECT_MULTIPLE
            query = query % ', '.join(['UNHEX(%s)'] * len(split_values)) 
            cur.execute(query, split_values)

            #print ("Type of cur " + str(type(k)))
            #Next line returns 2^64 -1 , and its type is long.
            #print ("Value of cur = " + str(k))

            cur2 = list(cur.fetchall())
            #cur.fetchall()

            for hash, sid, offset in cur2:
                # (sid, db_offset - song_sampled_offset)
                yield (sid, offset - mapper[hash])

Работа с или без выборкивыборка всех данных вместе или по одному, выполнение запроса с 1000 или 10 значениями ничего не изменило в общем времени.

...