У меня есть 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 значениями ничего не изменило в общем времени.