Какую сделать структуру таблицы в MySQL, чтоб менять позицию записи с минимальным усилием сервера?
Вопрос "минимальных усилий" для списка из 48 товаров (и даже 10000) не имеет значения. 
Он у вас возникнет если эти изменения вы пожелаете делать десятки раз в секунду на базе под нагрузкой в  десятки/сотни запросов в секунду. 
До тех пор варианты 1 и 2 равнозначны.
Изучив все предложенные варианты, пришёл к выводу, что если нагрузка предполагается маленькая, то сделать по-простому: каждому товару давать номер позиции (первый предполагаемый вариант).
А если нагрузка увеличится, то можно переделать под вариант со значимостью с шагом, равным 1024 (позволяет 10 раз вставить другие товары после определённого товара). И во время смены позиции сделать проверку: если между вставляемыми товарами разница значимости равна единице, то всем товарам пересчитать данный показатель, снова установив шаг, равный 1024.