Как лучше сделать запрос для сортировки вывода

Q_BASIC

Хранитель порядка
Регистрация
30 Ноя 2013
Сообщения
516
Реакции
1.240
Здравствуйте :)

Есть некоторый товар, у него есть сортировка (перетаскивание мышкой места) и на сервер отсылается новый порядок.

На сервере изменяется `rank` у товара. Сейчас глянул, и заметил, что для каждого товара свой запрос к БД.

А если товаров будет хотя бы 100? Это же уже нагрузит БД

Как оптимизировать данную операцию?



Пример запросов:
Код:
UPDATE `tovars` SET `rank`=0 WHERE `id`=242
UPDATE `tovars` SET `rank`=1 WHERE `id`=139
UPDATE `tovars` SET `rank`=2 WHERE `id`=482

Думаю, что эти запросы можно как-то к 1 запросу свести
 
Во-первых, сто таких запросов базу не нагрузят. Но в момент апдейта на таблицах MyISAM действительно идет блокировка на чтение и запись, и для хайлод проектов это вообще неприемлемо. Поэтому используем тип хранилища InnoDB (ALTER TABLE `my_table` ENGINE = InnoDB), в этом случае блокировка идет на уровне только одной строки, а не всей таблицы.
Множественный апдейт вообще Для просмотра ссылки Войди или Зарегистрируйся
Поверьте, есть уж куда более ресурсоемкие запросы, которые следует оптимизировать.
 
На стороне сервера - сложная задача.
1) Можно попробовать писать в промежуточную таблицу таблицу данные вида id,sort. А потом по крону, или триггером делать общий апдейт полей таблицы товаров с очисткой промежуточной таблицы.
2) Но лучше собирать на стороне клиента все запросы, а потом слать один общий.
3) Еще можно повесить delay на эти запросы (Допустим не чаще, чем раз в секунду). Это так же снизит нагрузку на сервер.
 
Используйте хранимые процедуры, и вызывайте их командой exec. Нагрузку сокращает, и увеличивает быстродействие
 
Назад
Сверху