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

Тема в разделе "Базы данных", создана пользователем Q_BASIC, 24 май 2015.

Модераторы: latteo
  1. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    385
    Симпатии:
    254
    Здравствуйте :)

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

    На сервере изменяется `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 запросу свести
     
  2. Black Hat

    Black Hat Постоялец

    Регистр.:
    15 май 2015
    Сообщения:
    120
    Симпатии:
    80
    Во-первых, сто таких запросов базу не нагрузят. Но в момент апдейта на таблицах MyISAM действительно идет блокировка на чтение и запись, и для хайлод проектов это вообще неприемлемо. Поэтому используем тип хранилища InnoDB (ALTER TABLE `my_table` ENGINE = InnoDB), в этом случае блокировка идет на уровне только одной строки, а не всей таблицы.
    Множественный апдейт вообще Перейти по ссылке
    Поверьте, есть уж куда более ресурсоемкие запросы, которые следует оптимизировать.
     
    denverkurt, latteo и nejtr0n нравится это.
  3. nejtr0n

    nejtr0n Постоялец

    Регистр.:
    24 янв 2014
    Сообщения:
    118
    Симпатии:
    62
    На стороне сервера - сложная задача.
    1) Можно попробовать писать в промежуточную таблицу таблицу данные вида id,sort. А потом по крону, или триггером делать общий апдейт полей таблицы товаров с очисткой промежуточной таблицы.
    2) Но лучше собирать на стороне клиента все запросы, а потом слать один общий.
    3) Еще можно повесить delay на эти запросы (Допустим не чаще, чем раз в секунду). Это так же снизит нагрузку на сервер.
     
    Black Hat нравится это.
  4. t1975453

    t1975453 Писатель

    Регистр.:
    20 мар 2009
    Сообщения:
    7
    Симпатии:
    0
    Используйте хранимые процедуры, и вызывайте их командой exec. Нагрузку сокращает, и увеличивает быстродействие