Нужна помощь в оптимизации кода, не могу решить использовать dataframe для сортировки или mysql

#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-секундный запрос может раздражать, но это может быть не критично. Но, как было предложено в комментариях, запуск его локально на рабочей станции может быть не очень хорошим показателем того, когда вы в конечном итоге отправите его на сервер.