mysql_query и множественные запросы

12 3
M
На сайте с 20.08.2004
Offline
376
3378

как можно через mysql_query организовать множественный апдейт.

если отсылать по одному он вешает сервер.

спасибо.

UPDATE `pr_blog` SET `comment_cnt`=0;UPDATE `pr_blog` SET `comment_cnt`=4 WHERE `blog_id`=1;UPDATE `pr_blog` SET `comment_cnt`=33 WHERE `blog_id`=2;UPDATE `pr_blog` SET `comment_cnt`=16 WHERE `blog_id`=3;UPDATE `pr_blog` SET `comment_cnt`=1 WHERE `blog_id`=10;UPDATE `pr_blog` SET `comment_cnt`=1 WHERE `blog_id`=12;UPDATE `pr_blog` SET `comment_cnt`=1 WHERE `blog_id`=16;UPDATE `pr_blog` SET `comment_cnt`=7 WHERE `blog_id`=17;UPDATE `pr_blog` SET `comment_cnt`=3 WHERE `blog_id`=21;UPDATE `pr_blog` SET `comment_cnt`=13 WHERE `blog_id`=22;
errno =1064:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE `pr_blog` SET `comment_cnt`=4 WHERE `blog_id`=1;UPDATE `pr_blog` SET `com' at line 1
отец сыночка, лапочки дочки и еще одного сыночка
ewg777
На сайте с 04.06.2007
Offline
225
#1

А какая задача стоит? Может возможно более рационально её решить? Или на крайний случай MySQLi

M
На сайте с 20.08.2004
Offline
376
#2

задача пересчитать счетчики сообщений...

Dreammaker
На сайте с 20.04.2006
Offline
569
#3

Miracle, какой объём базы, точнее конкретно таблицы pr_blog? Есть ли индексы на поле blog_id ?

Если размер большой, то возможно стоит удалять индекс, закатывать изменения, а потом добавлять индекс.

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

N
На сайте с 06.05.2007
Offline
419
#4

Чисто теоретически UPDATE DELAYED позволяет подавать следующий запрос не дожидаясь ответа,

но у вас проблема в самих запросах. засунуть в mysql_query() больше одного запроса не получится.

вот прямо первый UPDATE `pr_blog` SET `comment_cnt`=0 ; - он ведь обновляет все записи без ограничений ? это не будет быстро работать.

Предлагаю вам логически разбить всю работу на порции по идентификаторам.

Например, сначала обновить записи с ид от 0 до 100, потом от 101 до 201 и тд. такой процесс можно растянуть не вызывая тревоги у сисадминов.

Кнопка вызова админа ()
wdsg
На сайте с 09.02.2009
Offline
31
#5

Мне кажется, что гораздо более оптимально выполнять

UPDATE `pr_blog` SET `comment_cnt`=`comment_cnt`+1 WHERE `blog_id`=17 LIMIT 1;

при добавлении каждого комментария. Нагрузка, в общем случае, будет распределена куда более равномерно. Или это противоречит поставленной задаче?

Проектирование и разработка сложных IT-систем. Вожусь с проблемными задачами.
M
На сайте с 20.08.2004
Offline
376
#6
netwind:
Например, сначала обновить записи с ид от 0 до 100, потом от 101 до 201 и тд. такой процесс можно растянуть не вызывая тревоги у сисадминов.

так и делаю, но не особо это нравиться

wdsg:
Мне кажется, что гораздо более оптимально выполнять
не знал я что лимит влияет так, надо попробовать... хотя всегда предполагал что разницы никакой
Dreammaker:
конкретно таблицы pr_blog?

Имя индекса Тип Количество элементов Действие Поле

PRIMARY PRIMARY 52377 blog_id

user_id INDEX 1870 user_id

dkameleon
На сайте с 09.12.2005
Offline
386
#7

это свой двиг какой-то? вынесите счетчики в таблицу вида:

blog_id (KEY),comment_cnt

и далее весь пересчёт будет делаться одним вложенным запросом:

replace into blog_comment_counters select blog_id, count(1) from comments_table ct group by ct.blog_id

ну а для отображения уже один джойн :)

Дизайн интерьера (http://balabukha.com/)
M
На сайте с 20.08.2004
Offline
376
#8

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

но спасибо.

Miracle добавил 28.09.2009 в 19:44

а если для счетчика, с увеличивающимся объемом данных к 1це, сделать что то типа такого

update set value=1 where id in (x,y,z....) есть ли смысл?

хотел бы услышать знактоков.

по своему наблюдение where in - медленная конструкция

может тогда так

update set value=1 where id = x || id= y || id =z || ...

N
На сайте с 06.05.2007
Offline
419
#9

52377 записи. ой ну прям уникальное явление в российском интернете !

делается тупо : берете свой игровой комп для Крузиса(tm), поднимаете mysql, скачиваете базу и делаете все тяжелые операции и закачиваете назад.

M
На сайте с 20.08.2004
Offline
376
#10
netwind:
52377 записи. ой ну прям уникальное явление в российском интернете !
делается тупо : берете свой игровой комп для Крузиса(tm), поднимаете mysql, скачиваете базу и делаете все тяжелые операции и закачиваете назад.

я могу еще 10 подобных способов придумать, я хочу сделать максимально интересно и правильно.

можно через load in file, можно slq и exec , как предложили вы, можно вообще руками - но все это не то...

никогда я не думал что это проблема...

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий