Taraflex
@Taraflex
Ищу работу. Контакты в профиле.

Как оптимизировать sql запрос?

Цель.
Добавить в таблицу строку, в которой поле weight = максимальный weight из всех строк + 1
INSERT INTO `feeds` (title, link, weight) VALUES (:title, :link,
							    (SELECT * FROM (SELECT (IFNULL(MAX(weight),0) + 1) FROM `feeds`) as tmp LIMIT 1)
							)

Индекс по weight стоит.

Можно развернуть это в что-то менее монстроузное?
Записей в таблице немного совсем (не планируется > 1000). Просто хочется сделать красивее.
  • Вопрос задан
  • 804 просмотра
Решения вопроса 3
valerium
@valerium
Изобретая велосипед
Напишите триггер, который при вставке будет будет текущий weight вставлять в таблицу типа Memory. Соответственно, оттуда же вставка его будет брать. Правда, при этом потребуется однократная "инициализация" при запуске БД.

Можно триггером и в простую MyISAM таблицу писать, это будет чуть дольше, зато без проблем с перезагрузкой.

И да, поясните, зачем оно вообще надо. Любопытно :-)
Ответ написан
@IceJOKER
Web/Android developer
f1eb8725a4.jpg
Ответ написан
Комментировать
opium
@opium
Просто люблю качественно работать
Если просто увеличиваете на 1, сделайте кей с автоинкрементом,
какую функцию несёт в себе это поле?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Taraflex
@Taraflex Автор вопроса
Ищу работу. Контакты в профиле.
Уменьшил до

INSERT INTO `feeds` (title, link, weight) (SELECT :title, :link, (IFNULL(MAX(weight),0) + 1) FROM `feeds`)

По скорости выигрыша не дает.
Есть еще варианты?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы