У меня есть таблица со следующими столбцами:
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.
Мой вопрос — с точки зрения скорости и эффективности для веб-приложения (отображение результатов на веб-сайте / в приложении), какой из вышеуказанных методов лучше?
Я пытался сгенерировать время, затрачиваемое на каждый запрос, но оба сообщают о похожих цифрах, поэтому не могут сделать какие-либо выводы.
Любое объяснение экспертов или любая настройка кода будут по достоинству оценены.
Спасибо
В общем, для повышения производительности всегда нужно выбирать между памятью и временем. Результаты кэширования улучшат скорость, но потребуют больше памяти. Вы можете уменьшить использование памяти, вычисляя материал на лету за счет производительности.
В вашем случае сохранение дополнительных 1000+ значений в БД — это вопрос нескольких дополнительных килобайт. Расчет различий на лету окажет незначительное влияние на производительность. Любой из вариантов является абсолютным арахисом для любой БД и сервера.
Я бы продолжал делать вычисления на лету, так как это менее сложно и поддерживает нормализацию БД.
Первый метод самый быстрый, но, как уже упоминалось, подвержен ошибкам.
Могу ли я предложить другое решение, используя первичный ключ. Затем вы можете установить значение нового столбца в том, что вы пытаетесь изобразить из веб-приложения.
Затем, когда вы хотите узнать 50 лучших, вы можете использовать свой оригинальный метод поиска 50 лучших, используя ваш второй метод, где вы будете выбирать из таблицы, в которой хранятся различия.
Эти ссылки объясняют первичные ключи и как их использовать: