2013-08-16 4 views
0

Я пытаюсь понять, какие из следующих является лучшим вариантом:данных Расчеты MySQL против Python

  1. Расчет данных с использованием Python из вывода запроса MySQL.
  2. Выполняйте вычисления в самом запросе.

Например, запрос возвращает 20 строк с 10 столбцами. В Python я вычисляю разницу или деление некоторых столбцов.

Лучше ли это сделать в запросе или в Python?

ответ

1

Это, вероятно, дело вкуса, но ...

... чтобы дать вам прямо противоположный ответ, как один за Алма Do Mundo, для (не так) простой расчет сделанный на SELECT ... , я обычно пытаюсь использовать БД «как калькулятор».

Расчеты (в предложении SELECT ...) выполняются как последний шаг при выполнении запроса. На данный момент используются только соответствующие данные. Вся «большая работа» уже выполнена (обработка JOIN, где предложения, агрегаты, сортировка).

На данный момент нагрузка на выполнение некоторых арифметических операций с данными действительно мала. И это уменьшит сетевой трафик между вашим приложением и сервером БД.

Это, вероятно, дело вкуса мысли ...

+0

Как это сокращает сетевой трафик? Передаваемые данные будут фактически увеличиваться с БД на сервер приложений, потому что вычисления, выполненные в запросе, означают дополнительное количество столбцов и, следовательно, дополнительные данные. – Ravi

+0

@ Ravi Возможно, я пропустил точку, но, скажем, для вычисления суммы двух столбцов, я делаю 'SELECT a + b' вместо' SELECT a, b', выполняя добавление на языке хоста, я сократил сеть трафика почти на 50%. –

+0

Согласовано. Мой ответ основан на общем случае (такие неприятные вещи, как «ORDER BY RAND()» - например) –

1

Если вы делаете основную арифметическую операцию по расчетам в ряд, а затем сделать это в SQL. Это дает вам возможность инкапсулировать результаты в виде или хранимой процедуре. Во многих базах данных это также дает возможность параллельного выполнения операторов (хотя производительность не является проблемой с таким количеством строк данных).

Если вы выполняете операции между строками в MySQL (например, получение max для столбца), тогда баланс более четный. Большинство баз данных поддерживают простые функции для этих вычислений, но MySQL этого не делает. Добавленная сложность запроса дает некоторый вес для выполнения этих расчетов на стороне клиента.

На мой взгляд, наиболее важным соображением является ремонтопригодность кода. Используя базу данных, вам необходимо включить бизнес-правила в самой базе данных (какие сущности связаны с другими объектами, например). Основная проблема с поддержанием кода заключается в том, что бизнес-логика распространяется через различные системы. Я предпочитаю иметь подход, когда такая логика максимально сжата, создавая очень четкие API-интерфейсы между разными слоями.

Для такого подхода «чтение» доступа к базе данных будет осуществляться через представления. Логика, о которой вы говорите, войдет в представления и будет доступна любому пользователю базы данных - обеспечивая согласованность между различными функциями с использованием базы данных. «запись» будет осуществляться через хранимые процедуры, гарантируя, что бизнес-правила будут проверяться последовательно и что операции будут регистрироваться соответствующим образом.

+0

Я не уверен, что преимущество инкапсуляции результатов в представлении идет с моим делом. Таблицы часто обновляются, и из того, что я понял до сих пор, мнения не особенно полезны в таком сценарии. Возможно, это мое непонимание вашего заявления, но что вы подразумеваете под MySQL, не поддерживает простые функции для MAX и т. Д. MySQL действительно поддерживает эти операции? – Ravi

+0

@Ravi Даже в MySQL поддержка * агрегатные функции *, ему не хватает [функций окна] (http://www.postgresql.org/docs/9.1/static/tutorial-window.html). Вы можете «легко» имитировать их, но при увеличенной сложности и времени выполнения. –

Смежные вопросы