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

1 23
edogs software
На сайте с 15.12.2005
Offline
775
#21
Dreammaker:
Ну и апдейт 50К записей - это несложная задача, тут даже проблема с пересчётом индексов не должно возникнуть. Такое ощущение, что что-то где-то не так, и как мне кажется вешается не mysql, а что-то другое. Случайно не через пхпмайдмин пытаетесь загнать дамп?

Если решать задачу "в лоб", это 50к запросов в базу. Если это вирт.хостинг, да еще мускул на отдельном сервере (в том смысле что запросы еще по сети гоняются), он не то что может упасть - он должен падать:)

Miracle,

по первому пункту подробнее не знаю как объяснить. Там простые условия:)

Т.е. 3 апдейта вида


update table set field=0; update table set field=3 where id=5; update table set field=10 where id=20;

заменяются на


update table set field=if(id=5,3,if(id=20,10,0))

По второму пункту, чуть сложнее. Но суть

update wp_posts set comment_count=(select count(*) from wp_comments where wp_posts.ID=wp_comments.comment_post_ID) 

в том, что Вы делаете выборку count(*) количества записей для каждого отдельного поста, и выставляете ее в поле. Объединение идет по условию wp_posts.ID=wp_comments.comment_post_ID

Для Вашего примера это должно быть нечто вроде


update pr_blog set comment_cnt=(
select count(*) from pr_blog_comment where pr_blog_comment.blog_id=pr_blog.blog_id
)

И последнее что хотелось бы отметить.


$query = "SELECT blog_id , COUNT(blog_id) cnt FROM pr_blog_comment GROUP BY `blog_id` ORDER BY cnt DESC LIMIT ".($p*2000).",2000"; //приходится по 2000 делать, итак сервер падал в 502-504

Если бьете выборку, бейте ее как-нибудь однозначно. Тут лучше делать order by blog_id например. Т.к. количество комментов у Вас может оказаться одинаковым в разных блогах, и сортировка выборки при одинаковом кол-ве комментов будет непредсказуемой. То есть пары blog_id, count(blog_id) могут выбраться как 12, 10 ; 15, 10; 20, 10 или как 15, 10; 20, 10; 12, 10 ; . И если это попадет на границу лимита, то часть блогов можете упустить при апдейте, а часть проапдейтить дважды.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
Dreammaker
На сайте с 20.04.2006
Offline
569
#22
edogs:
Если это вирт.хостинг

ну какбы выше уже написали

Miracle:
Сервех 2х процессорный 8 гб памяти - дохлый?

:)

Miracle,

Тут возникает вопрос именно откуда берётся повод для пересчёта? Таблицы MyISAM, конечно, не особо предназначены для высокоточных данных, но и терять данные вроде бы не должны в таких размерах, чтобы это на что-то влияло в данной ситуации.

AN
На сайте с 05.06.2004
Offline
243
#23
Miracle:
Сервех 2х процессорный 8 гб памяти
на нем два живучих проекта 25 к уников вместе и два пхпбб2 форума

IMHO надо начать с настроек базы:)

my.cnf покажите.

Размещу ваши баннеры на посещаемых сайтах. Места еще есть! Возможен безнал. (/ru/forum/324945) Нужны копирайтеры/рерайтеры - медики. Пишите в личку. (/ru/forum/676932)
M
На сайте с 20.08.2004
Offline
376
#24
Dreammaker:
Тут возникает вопрос именно откуда берётся повод для пересчёта? Таблицы MyISAM, конечно, не особо предназначены для высокоточных данных, но и терять данные вроде бы не должны в таких размерах, чтобы это на что-то влияло в данной ситуации.

немного их актуализировал :) ничего не теряется.

AnNik:
my.cnf покажите.

если что то подскажете буду признателен

[mysqld]

slow_query_log = 1
#general_log = 1
#general_log_file = '/var/log/mysql/query.log'

binlog-format=MIXED
log-bin
sync-binlog=1
log-bin-trust-function-creators

log-error=/var/log/mysql/error.log
slow-query-log-file=/var/log/mysql/slow.log

port = 3306
socket = /tmp/mysql.sock
skip-locking

max_allowed_packet = 1M
table_cache = 4096
table_open_cache = 4096
sort_buffer_size = 20M
net_buffer_length = 8K
read_buffer_size = 20M
read_rnd_buffer_size = 20M

myisam_sort_buffer_size = 64M
myisam_use_mmap

thread_concurrency=3
thread_stack=1M

max_connections = 750
max_user_connections = 700
thread_cache_size = 32

query-cache-type=1
query_cache_size=50M
query_cache_limit=20M
join_buffer_size=50M
key_buffer_size=200M

tmp_table_size=200M
max_heap_table_size=500M

[mysqld0]

slow_query_log = 1
#general_log = 1
#general_log_file = '/var/log/mysql/query.log'

datadir=/var/mysql

log-error=/var/log/mysql/error.log
slow-query-log-file=/var/log/mysql/slow.log

port = 3306
socket = /tmp/mysql.sock

[mysqld1]

slow_query_log = 1
#general_log = 1
#general_log_file = '/var/log/mysql/query.log'

datadir=/var/db/mysql-a

log-error=/var/log/mysql/error-a.log
slow-query-log-file=/var/log/mysql/slow-a.log

#pid-file=/var/run/mysql-a.sock

skip-networking

port = 3307
socket = /tmp/mysql-a.sock
skip-locking

max_allowed_packet = 1M
table_cache = 4096
table_open_cache = 4096
sort_buffer_size = 20M
net_buffer_length = 8K
read_buffer_size = 20M
read_rnd_buffer_size = 20M

myisam_sort_buffer_size = 64M
myisam_use_mmap

thread_concurrency=3
thread_stack=1M

max_connections = 750
max_user_connections = 700
thread_cache_size = 32

query-cache-type=1
query_cache_size=50M
query_cache_limit=20M
join_buffer_size=50M
key_buffer_size=200M

tmp_table_size=200M
max_heap_table_size=500M



[mysqld2]

slow_query_log = 1
#general_log = 1
#general_log_file = '/var/log/mysql/query.log'

datadir=/var/db/mysql-b

log-error=/var/log/mysql/error-b.log
slow-query-log-file=/var/log/mysql/slow-b.log

#pid-file=/var/run/mysql-b.sock

skip-networking

port = 3308
socket = /tmp/mysql-b.sock
skip-locking


Miracle добавил 29.09.2009 в 16:03

видимо настройка самая первая раз подключаюсь так

DEFINE ("DB_HOST",':/tmp/mysql.sock');
отец сыночка, лапочки дочки и еще одного сыночка
AN
На сайте с 05.06.2004
Offline
243
#25

Первое, что бросилось в глаза:

Miracle:
sort_buffer_size = 20M
net_buffer_length = 8K
read_buffer_size = 20M
read_rnd_buffer_size = 20M

max_connections = 750

Не многовато ли?

Проверьте по топу, при выполнении этих проблемных запросов, не начинает ли MySQL отжирать всю память сервера, подвешивая его в конце концов?

tuning-primer.sh:
$read_buffer_size+$read_rnd_buffer_size+$sort_buffer_size+$thread_stack+$join_buffer_size+$binlog_cache_size)*$max_connections
M
На сайте с 20.08.2004
Offline
376
#26

Маэскуэль временами жрет около 100% , так что это бывает :)

Однако памяти как минимум всегда 2гига чистых

[Удален]
#27

Я кстати можт проглядел, поэтому спрошу на всякий: а у вас эта табличка уж не InnoDB ли?

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

neolord,

Miracle:
) ENGINE=MyISAM AUTO_INCREMENT=48716 DEFAULT CHARSET=cp1251;

проглядели :)

Слава Шевцов
На сайте с 23.07.2005
Offline
370
#29
Miracle:
как можно через mysql_query организовать множественный апдейт.
если отсылать по одному он вешает сервер.

спасибо.

Не о том думаете в оптимизации Ваших запросов. Вот это будет работать существенно быстрее, чем Ваш запрос:


mysql_query('UPDATE `pr_blog` SET `comment_cnt`=0 WHERE `blog_id`!=1 AND `blog_id`!=2 AND `blog_id`!=3 AND `blog_id`!=10 AND `blog_id`!=12 AND `blog_id`!=16 AND `blog_id`!=17 AND `blog_id`!=21 AND `blog_id`!=22');
mysql_query('UPDATE `pr_blog` SET `comment_cnt`=4 WHERE `blog_id`=1');
mysql_query('UPDATE `pr_blog` SET `comment_cnt`=33 WHERE `blog_id`=2');
mysql_query('UPDATE `pr_blog` SET `comment_cnt`=16 WHERE `blog_id`=3');
mysql_query('UPDATE `pr_blog` SET `comment_cnt`=1 WHERE `blog_id`=10');
mysql_query('UPDATE `pr_blog` SET `comment_cnt`=1 WHERE `blog_id`=12');
mysql_query('UPDATE `pr_blog` SET `comment_cnt`=1 WHERE `blog_id`=16');
mysql_query('UPDATE `pr_blog` SET `comment_cnt`=7 WHERE `blog_id`=17');
mysql_query('UPDATE `pr_blog` SET `comment_cnt`=3 WHERE `blog_id`=21');
mysql_query('UPDATE `pr_blog` SET `comment_cnt`=13 WHERE `blog_id`=22');
Неизменность точки зрения неизменно порождает иллюзию понимания.
[Удален]
#30

По-моему таки Replace будет работать еще быстрее

1 23

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