MySQL для выбора МАКСИМАЛЬНЫХ различий двух столбцов

У меня есть таблица со следующими столбцами:

ItemCode VARCHAR
PriceA DECIMAL(10,4)
PriceB DECIMAL(10,4)

В таблице около 1000 строк.

Мое требование - проверить разницу (PriceA-PriceB) для каждой строки, а затем отображать 50 лучших товаров, которые имеют максимальную разницу в цене.

Есть два способа реализовать это

1) Поверьте, что расчет SQL несложный, простой и быстрый, поэтому я выполняю следующий запрос:

SELECT ItemCode, (PriceA - PriceB) AS PDiff  FROM testtable  ORDER BY PDiff DESC LIMIT 50

и во-вторых,

2) Добавьте еще один столбец (называемый PriceDiff), в котором будет храниться разница (PriceA-PriceB).

Однако их придется вставлять вручную, и для этого потребуется дополнительное пространство. Но он может просто запустить запрос выбора MAX(PriceDiff) для 50 лучших.

У меня вопрос - какой из вышеперечисленных методов лучше с точки зрения скорости и эффективности веб-приложения (отображение результатов на веб-сайте / в приложении)?

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

Мы будем очень благодарны за любые объяснения экспертов или любую точную настройку кода.

Спасибо

Используйте номер 1 вместо вычисляемого столбца.

Dave 20.12.2018 15:48

СУХОЙ. Не повторяйся. То, что можно рассчитать, следует рассчитать. Нет необходимости дублировать информацию (изменение значений тоже может привести к ошибкам)

Cid 20.12.2018 15:50

Обратите внимание, что вам нужно использовать ABS(PriceA - PriceB) в случае, если PriceB больше, чем PriceA.

gregmac 20.12.2018 15:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
3
198
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В общем, для повышения производительности всегда нужно выбирать между памятью и временем. Результаты кэширования улучшают скорость, но требуют больше памяти. Вы можете уменьшить использование памяти, вычисляя данные на лету за счет производительности.

В вашем случае для хранения дополнительных 1000+ значений в БД требуется несколько дополнительных килобайт. Вычисление разницы на лету окажет незначительное влияние на производительность. Любой вариант - абсолютная ерунда для любой БД и сервера.

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

Большое спасибо @EriksKlotins (и другим) за ваш ценный вклад. Я выберу первый, учитывая все предоставленные обоснования.

Aquaholic 20.12.2018 17:14

Первый метод самый быстрый, но, как уже упоминалось, подвержен ошибкам.

Могу я предложить другое решение с использованием первичного ключа. Затем вы можете установить значение нового столбца, которое вы пытаетесь вычислить из веб-приложения.

Затем, если вы хотите узнать 50 лучших, вы можете использовать свой исходный метод поиска 50 лучших, используя второй метод, где вы должны выбрать из таблицы, в которой хранятся различия. Эти ссылки объясняют первичные ключи и способы их использования:

http://www.mysqltutorial.org/mysql-primary-key/

https://www.w3schools.com/sql/sql_primarykey.asp

Другие вопросы по теме