Оптимизация инкрементирования в UPDATE

Solid

Drosera anglica
Оптимизация инкрементирования в UPDATE

При больших наплывах посетителей вдруг начинают скапливаться в очереди UPDATE запросы, т.к., понятное дело, что им требуется найти, записать и переписать индексы. Возможно ли как то ускорить данный процесс?
song_id и song_hits - проиндексированны.
Код:
UPDATE song SET song_hits=song_hits+1 WHERE song_id=222;
 

vadim

Guest
Solid
Что вы понимаете под словом "проиндексированы"?? Какой тип индексов там стоит?? И зачем индекс на song_hits?? Это же, насколько я понимаю, сколько раз какую то песню кликнули?? Или??
 

Solid

Drosera anglica
Автор оригинала: vadim
Solid
Что вы понимаете под словом "проиндексированы"?? Какой тип индексов там стоит?? И зачем индекс на song_hits?? Это же, насколько я понимаю, сколько раз какую то песню кликнули?? Или??
Да, именно. Стоит обычный индекс. Индексация нужна для быстрой сортировки.

-~{}~ 22.04.06 18:12:

Без индекса сортировка занимает 1 сек, с индексом 0.0001.
Я бы убрал бы индекс, если бы эта сортировка производилась не на главной странице.

-~{}~ 22.04.06 18:14:

Фанат
Того же самого я жду и от тебя.
 

vadim

Guest
Solid
ПОпробуйте ради эксперимента оставить индекс только на ID, причём Primary Key (ID же уникальный??). А song_hits сделать обычным полем.
Мысль проста: такой update происходит очень часто по сравнению с сортировкой песен по кол-ву кликов.
 

Solid

Drosera anglica
Причём с индексом переписывает всего в 1.5 раза медленнее, нежели без него.

-~{}~ 22.04.06 18:18:

vadim
Ненамного быстрее. Чаще всего даже точно так же.

-~{}~ 22.04.06 18:19:

Всетаки в 1000 и 1.5 раза - разница есть. :)

-~{}~ 22.04.06 18:22:

Проблема в том, что делается LOCK TABLE, и это, как мне кажется, в любом случае (проверял только с индексами). Можно ли как-то его обойти? Глупость конечно, но иного пути я просто не вижу.
 

vadim

Guest
Solid
Ну тогда что можно сказать :)
Вы сами все цифры привели: решение за вами
Что вам важней

Есть ещё опции: например настройка сервера для чатсых апдейтов, но это глобальные изменения, которые коснутся всего, так что ради одного скрипта такие вещи не стоит.

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

-~{}~ 22.04.06 18:25:

Solid
А зачем здесь LOCK??? это же всего лишь счётчик кликов??
 

Wicked

Новичок
Vadim,
я бы сказал:
А зачем здесь LOCK? это же "update set n = n + 1".
Чесно говоря, не вижу смысла вообще лочить таблицы ТОЛЬКО для этого апдейта.
 

Kelkos

Сам себе программер
как вариант апдейтить поле в другой талице (где нет индексов и пр.) и при каждой сотне (или раз в час, например) 1 раз апдейтить на поле в основной таблице на количество во "временной".. помоему других то путей и нет с такими условиями.
 

Solid

Drosera anglica
Автор оригинала: Wicked
Vadim,
я бы сказал:
А зачем здесь LOCK? это же "update set n = n + 1".
Чесно говоря, не вижу смысла вообще лочить таблицы ТОЛЬКО для этого апдейта.
LOCKи ставятся автоматом, по-этому то UPDATE очередь и занимают.

-~{}~ 22.04.06 20:01:

Ясно... Всем спасибо за участие в теме.

-~{}~ 04.05.06 11:57:

А что если создать таблицу "song2hits", куда в начале записывать "на какие песни кликнули", где будет всего два поля: song_id|hit_timestamp, где song_id - идентификатор песни на которую кликнули, hit_timestamp - время клика.
А дальше делать что то вроде: SELECT song_id, COUNT(song_id) FROM song2hits WHERE hit_timestamp<NOW() GROUP BY song_id; дальше в цикле UPDATE всех песен в таблице song (где и содержится song_hit - кол-во кликов). Всё это делать раз в час, по 10-100 запросов, потом пауза.
Или, может, предложете какой-то более вменяемый способ?
 

camka

не самка
А если использовать InnoDB вместо MyISAM? У нее механизм блокировки построчный. Возможно, поможет.
 

Solid

Drosera anglica
Автор оригинала: camka
А если использовать InnoDB вместо MyISAM? У нее механизм блокировки построчный. Возможно, поможет.
Ага, думал над этим... Надо протестировать... Никак настоить не могу.
Спасибо за коммент.
 
Сверху