#python #mysql #python-3.x
#python #mysql #python-3.x
Вопрос:
Я пишу код для получения данных из базы данных 1m (размер может увеличиться). У меня есть сервер mysql локально, и я пишу все на python. не очень хорошо получается и пытается все оптимизировать.
Первый вопрос в том, могу ли я написать лучший sql-запрос, а второй вопрос в том, должен ли я попытаться сделать все, используя mysql, или будет хорошо, если я использую dataframe, например, для сортировки и фильтрации данных
def listJE(company_id, page_num, per_page):
columns = 'tr_id, ' 'tr_date, ' 'description, ' 'dr_acc, '
'cr_acc, ' 'amount, ' 'currency, ' 'document, ' 'comment'
sn = (page_num - 1) * per_page
en = per_page
ncon = myDB()
query = """SELECT {}
FROM transactions
WHERE company_id = {} and deleted = 0
ORDER BY tr_id
DESC LIMIT {}, {}""".format(
columns, company_id, sn, en)
df = ncon.getDF(query)
return df
Комментарии:
1. Если вы можете упорядочивать, фильтровать и сортировать данные с помощью базы данных, вы должны (не должны, ДОЛЖНЫ), чтобы база данных делала это за вас. База данных предназначена для работы с данными, а это означает сортировку, фильтрацию, поиск, ограничение результатов и т.д.
2. Спасибо, я очень новичок во всем этом и хотел также измерить, насколько нормальный результат. например, для получения 1 миллиона записей из базы данных мне нужно что-то вроде 5 секунд, поскольку я использую несколько условий WHERE. копался в форумах, и там было сказано, что использовать предложение CASE, маленький sql-запрос, который у меня есть, плохой или нуждается в улучшении?
3. Если вы действительно пытаетесь оптимизировать, поскольку не похоже, что ваш список столбцов меняется, вы можете жестко закодировать столбцы в запросе, а не выполнять 8 конкатенаций
4. Спасибо, я тоже это сделаю.
5. Также кто-то предположил, что использование ORM может помочь, но меня больше беспокоит производительность и что вы об этом думаете?
Ответ №1:
В вашем случае я бы предложил использовать MySQL для сортировки и возврата нужных вам записей. Pandas — удивительный инструмент и может многое сделать, но в данном случае он может оказаться не лучшим для вас.
Поскольку вы, похоже, ограничиваете количество строк из таблицы с более чем 1 миллионом записей, вероятно, более эффективно, чтобы MySQL сортировал ее и предоставлял вам нужные записи, а не упаковывал всю таблицу, передавал ее в ваше приложение, а затем предоставлял вам самим определятьлучший способ отсортировать его и вырезать соответствующие записи.
Если вы выполняете запрос много раз (как, по-видимому, подразумевает ваша разбивка на страницы), MySQL может кэшировать результат запроса, см. Этот вопрос . Поэтому на следующей итерации он может просто сказать: «О, у меня это уже есть!» и отправить вам результат, а не пересчитывать его.
Оптимизация очень приятна, но учитывайте затраты времени и удобочитаемость. Если вы можете сэкономить некоторое время и сделать вещи более удобочитаемыми на будущее, например, жестко кодировать имена столбцов в запросе, а не объединять их, продолжайте и сделайте это. Если вы беспокоитесь о потере нескольких миллисекунд между MySQL или обработкой в python, вам следует учитывать полученное значение.
Если вы создаете сайт с низким трафиком, то 5-секундный запрос может раздражать, но это может быть не критично. Но, как было предложено в комментариях, запуск его локально на рабочей станции может быть не очень хорошим показателем того, когда вы в конечном итоге отправите его на сервер.