Снижение нагрузки. Разбиение одной большой таблицы на маленькие

Видит бог, разработчик думал, прежде чем всё это намутить... просто опыта в этом видимо не так много (печально )))
Извините все, времени не было отписаться... желание разбивать одну таблицу на несколько у меня пока пропало (я вообще с трудом представляю, как это можно внедрить в рабочую систему ))
Так вот, выяснилось, что MySQL-сервер виснет при выполнении запроса (как показал SHOW PROCESSLIST при выполнении его не из под рута) - т.е. этот запрос висит в самом верху таблицы, показываемой по вводу SHOW PROCESSLIST (я так понимаю это определяется так).

PHP:
mysql> SHOW CREATE TABLE battle\G
*************************** 1. row ***************************
       Table: battle
Create Table: CREATE TABLE `battle` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `person_id` int(10) unsigned NOT NULL DEFAULT '0',
  `opponent_id` int(10) unsigned NOT NULL DEFAULT '0',
  `is_winner` tinyint(1) NOT NULL DEFAULT '0',
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `person_message_id` int(10) unsigned DEFAULT NULL,
  `opponent_message_id` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `date` (`date`),
  KEY `person_battle` (`person_id`,`date`),
  KEY `person_opponent_date` (`person_id`,`opponent_id`,`date`)
) ENGINE=MyISAM AUTO_INCREMENT=5844448 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> SHOW INDEX FROM battle;
+--------+------------+----------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table  | Non_unique | Key_name             | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------+------------+----------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| battle |          0 | PRIMARY              |            1 | id          | A         |     5844897 |     NULL | NULL   |      | BTREE      |         |
| battle |          1 | date                 |            1 | date        | A         |     1461224 |     NULL | NULL   |      | BTREE      |         |
| battle |          1 | person_battle        |            1 | person_id   | A         |      243537 |     NULL | NULL   |      | BTREE      |         |
| battle |          1 | person_battle        |            2 | date        | A         |     5844897 |     NULL | NULL   |      | BTREE      |         |
| battle |          1 | person_opponent_date |            1 | person_id   | A         |      243537 |     NULL | NULL   |      | BTREE      |         |
| battle |          1 | person_opponent_date |            2 | opponent_id | A         |     5844897 |     NULL | NULL   |      | BTREE      |         |
| battle |          1 | person_opponent_date |            3 | date        | A         |     5844897 |     NULL | NULL   |      | BTREE      |         |
+--------+------------+----------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
7 rows in set (0.00 sec)

mysql> EXPLAIN SELECT DISTINCT(opponent_id) FROM battle WHERE person_id = 1728847 AND `date` BETWEEN DATE_SUB(NOW(), INTERVAL 24 HOUR) AND NOW();
+----+-------------+--------+------+-----------------------------------------+----------------------+---------+-------+------+--------------------------+
| id | select_type | table  | type | possible_keys                           | key                  | key_len | ref   | rows | Extra                    |
+----+-------------+--------+------+-----------------------------------------+----------------------+---------+-------+------+--------------------------+
|  1 | SIMPLE      | battle | ref  | date,person_battle,person_opponent_date | person_opponent_date | 4       | const |    1 | Using where; Using index |
+----+-------------+--------+------+-----------------------------------------+----------------------+---------+-------+------+--------------------------+
1 row in set (0.00 sec)
Висит он обычно с такими показателями
PHP:
+-----------+---------+----------------------+---------+-------------+------+-----------+------------------+
| Id           | User     | Host                    | db       | Command | Time | State    | Info           |
+-----------+---------+----------------------+---------+-------------+-------+----------+------------------+
| 2940244 | user     | 127.0.0.1:63226 | db       | Query       |  565 | Locked  |  Текст запроса
В DISTINCT запроса попадает примерно 100 записей (и то сомневаюсь).
Ещё к таблице делается три других запроса на выборку - один по первичному ключую, который летает и два других:

PHP:
mysql> EXPLAIN SELECT person_message_id, opponent_message_id FROM battle WHERE id = 4282471;
+----+-------------+--------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table  | type  | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+--------+-------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | battle | const | PRIMARY       | PRIMARY | 4       | const |    1 |       |
+----+-------------+--------+-------+---------------+---------+---------+-------+------+-------+
1 row in set (0.02 sec)

mysql> EXPLAIN SELECT `date` FROM battle WHERE person_id = 1728847 ORDER BY `date` DESC LIMIT 1;
+----+-------------+--------+------+------------------------------------+---------------+---------+-------+------+--------------------------+
| id | select_type | table  | type | possible_keys                      | key           | key_len | ref   | rows | Extra                    |
+----+-------------+--------+------+------------------------------------+---------------+---------+-------+------+--------------------------+
|  1 | SIMPLE      | battle | ref  | person_battle,person_opponent_date | person_battle | 4       | const |    1 | Using where; Using index |
+----+-------------+--------+------+------------------------------------+---------------+---------+-------+------+--------------------------+
1 row in set (0.00 sec)

mysql> EXPLAIN SELECT COUNT(id) FROM battle WHERE person_id = 1728847 AND opponent_id = 13671 AND `date` BETWEEN DATE_SUB(NOW(), INTERVAL 24 HOUR) AND NOW();
+----+-------------+--------+------+-----------------------------------------+----------------------+---------+-------------+------+-------------+
| id | select_type | table  | type | possible_keys                           | key                  | key_len | ref         | rows | Extra       |
+----+-------------+--------+------+-----------------------------------------+----------------------+---------+-------------+------+-------------+
|  1 | SIMPLE      | battle | ref  | date,person_battle,person_opponent_date | person_opponent_date | 8       | const,const |    1 | Using where |
+----+-------------+--------+------+-----------------------------------------+----------------------+---------+-------------+------+-------------+
1 row in set (0.00 sec)
Собственно я думаю здесь теперь достаточно информации, чтобы помочь мне или хотя бы ткнуть куда нибудь...
Спасибо

-~{}~ 16.09.09 15:20:

забыл написать, что MySQL "виснит" при выполнении запроса
PHP:
SELECT DISTINCT(opponent_id) FROM battle WHERE person_id = 1728847 AND `date` BETWEEN DATE_SUB(NOW(), INTERVAL 24 HOUR) AND NOW();
 

whirlwind

TDD infected, paranoid
версию муськи скинь и процесслист. что там еще какие то запросы висят?
 
PHP:
mysql> SELECT VERSION();
+------------+
| VERSION()  |
+------------+
| 5.1.36-log |
+------------+
по поводу других процессов - только когда сервак опять зависнет )) Но там их обычно ещё около полусотни...
 

whirlwind

TDD infected, paranoid
ну дык это наверное важно. видишь там лок стоит. надо выяснить кто лочит
 
я почему то думал, что если Locked стоит, то он сам (запрос) и залочил... Ладно, когда такая фигня случится следующий раз, я её запощу сюда (правда места она займёт много ))).
И сразу вопрос наводищий - имеет ли значение из под какого пользователя выполнять SHOW PROCESSLIST ?

-~{}~ 16.09.09 23:48:

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

PHP:
mysql> show processlist;
+---------+---------+-----------------+---------+---------+------+------------+------------------------------------------------------------------------------------------------------+
| Id      | User    | Host            | db      | Command | Time | State      | Info                                                                                                 |
+---------+---------+-----------------+---------+---------+------+------------+------------------------------------------------------------------------------------------------------+
| 1604423 | asteria | 127.0.0.1:62525 | asteria | Query   | 8495 | Locked     | UPDATE person SET teacher_id = 233377 WHERE id = 269952                                              | 
| 1604434 | asteria | 127.0.0.1:62536 | asteria | Query   | 8495 | statistics | SELECT id
             FROM person 
             WHERE level = "2" AND
             person.id NOT | 
| 1604443 | asteria | 127.0.0.1:62545 | asteria | Query   | 8495 | Locked     | SELECT id , user_id, name, classpath, personshell, level, power, adroitness, endurance
             | 
| 1604448 | asteria | 127.0.0.1:62550 | asteria | Query   | 8495 | Locked     | SELECT id , user_id, name, classpath, personshell, level, power, adroitness, endurance
             | 
| 1604453 | asteria | 127.0.0.1:62555 | asteria | Query   | 8495 | Locked     | SELECT id , user_id, name, classpath, personshell, level, power, adroitness, endurance
             | 
| 1604455 | asteria | 127.0.0.1:62557 | asteria | Query   | 8495 | Locked     | SELECT silver_coins, gold_coins, win_count, lose_count FROM person WHERE id = 240398                 | 
| 1604468 | asteria | 127.0.0.1:62570 | asteria | Query   | 8495 | Locked     | SELECT id , user_id, name, classpath, personshell, level, power, adroitness, endurance
             | 
| 1604471 | asteria | 127.0.0.1:62573 | asteria | Query   | 8495 | Locked     | UPDATE person SET teacher_id = 134737 WHERE id = 269951                                              | 
| 1604473 | asteria | 127.0.0.1:62575 | asteria | Query   | 8495 | Locked     | SELECT silver_coins, gold_coins, win_count, lose_count FROM person WHERE id = 234148                 | 
| 1604478 | asteria | 127.0.0.1:62580 | asteria | Query   | 8495 | Locked     | UPDATE person SET `id` = "251609", `user_id` = "29244090", `teacher_id` = NULL, `is_main` = "1", `na | 
| 1604484 | asteria | 127.0.0.1:62586 | asteria | Query   | 8495 | Locked     | SELECT silver_coins, gold_coins, win_count, lose_count FROM person WHERE id = 234698                 | 
| 1604486 | asteria | 127.0.0.1:62588 | asteria | Query   | 8495 | Locked     | SELECT id FROM person WHERE user_id = 19594059 AND is_main = 1                                       | 
| 1604489 | asteria | 127.0.0.1:62591 | asteria | Query   | 8495 | Locked     | SELECT id FROM person WHERE user_id IN ("3800894", "5246882", "9301218", "9841472", "10589967", "112 | 
| 1604490 | asteria | 127.0.0.1:62592 | asteria | Query   | 8494 | Locked     | SELECT id, name, personshell, experience, level, health, cheerfulness, power, adroitness, endurance, | 
| 1604491 | asteria | 127.0.0.1:62593 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604492 | asteria | 127.0.0.1:62594 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604493 | asteria | 127.0.0.1:62595 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604494 | asteria | 127.0.0.1:62596 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604496 | asteria | 127.0.0.1:62598 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604497 | asteria | 127.0.0.1:62599 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604498 | asteria | 127.0.0.1:62600 | asteria | Query   | 8494 | Locked     | SELECT id FROM person WHERE user_id IN ("4152446", "25469211")                                       | 
| 1604500 | asteria | 127.0.0.1:62602 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604502 | asteria | 127.0.0.1:62604 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604503 | asteria | 127.0.0.1:62605 | asteria | Query   | 8494 | Locked     | SELECT id, name, personshell, experience, level, health, cheerfulness, power, adroitness, endurance, | 
| 1604504 | asteria | 127.0.0.1:62606 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604505 | asteria | 127.0.0.1:62607 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604506 | asteria | 127.0.0.1:62608 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604507 | asteria | 127.0.0.1:62609 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604508 | asteria | 127.0.0.1:62610 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604509 | asteria | 127.0.0.1:62611 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604510 | asteria | 127.0.0.1:62612 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604511 | asteria | 127.0.0.1:62613 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604512 | asteria | 127.0.0.1:62614 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604513 | asteria | 127.0.0.1:62615 | asteria | Query   | 8494 | Locked     | SELECT id, name, personshell, experience, level, health, cheerfulness, power, adroitness, endurance, | 
| 1604514 | asteria | 127.0.0.1:62616 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604515 | asteria | 127.0.0.1:62617 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604516 | asteria | 127.0.0.1:62618 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604517 | asteria | 127.0.0.1:62619 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604519 | asteria | 127.0.0.1:62621 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604520 | asteria | 127.0.0.1:62622 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604521 | asteria | 127.0.0.1:62623 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604522 | asteria | 127.0.0.1:62624 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604523 | asteria | 127.0.0.1:62625 | asteria | Query   | 8494 | Locked     | SELECT id, name, personshell, experience, level, health, cheerfulness, power, adroitness, endurance, | 
| 1604524 | asteria | 127.0.0.1:62626 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604525 | asteria | 127.0.0.1:62627 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604526 | asteria | 127.0.0.1:62628 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604527 | asteria | 127.0.0.1:62629 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604528 | asteria | 127.0.0.1:62630 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604529 | asteria | 127.0.0.1:62631 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604530 | asteria | 127.0.0.1:62632 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604531 | asteria | 127.0.0.1:62633 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604532 | asteria | 127.0.0.1:62634 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604533 | asteria | 127.0.0.1:62635 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604534 | asteria | 127.0.0.1:62636 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604535 | asteria | 127.0.0.1:62637 | asteria | Query   | 8494 | Locked     | SELECT id, name, personshell, experience, level, health, cheerfulness, power, adroitness, endurance, | 
| 1604536 | asteria | 127.0.0.1:62638 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604537 | asteria | 127.0.0.1:62639 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604538 | asteria | 127.0.0.1:62640 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604539 | asteria | 127.0.0.1:62641 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1604540 | asteria | 127.0.0.1:62642 | asteria | Query   | 8494 | Locked     | SELECT id, user_id, teacher_id, is_main, name, classpath, personshell, experience, health, cheerfuln | 
| 1608660 | root    | 127.0.0.1:64749 | NULL    | Query   |    0 | NULL       | show processlist                                                                                     | 
+---------+---------+-----------------+---------+---------+------+------------+------------------------------------------------------------------------------------------------------+
61 rows in set (0.00 sec)
-~{}~ 16.09.09 23:53:

Спасает от этого только перегруз сервака... наверняка все UPDATE/INSERT запросы которые висят сдесь не выполняются, данные теряются... но волнует меня всё таки пока одно - какого хрена это всё виснит !! ))
 

Sawa

Новичок
Вот блин, ты б проблему описал хоть.
Код:
SELECT DISTINCT(opponent_id) FROM battle WHERE person_id = 1728847 AND `date` BETWEEN DATE_SUB(NOW(), INTERVAL 24 HOUR) AND NOW();
Нет подобного висящего запроса.
плс глянь лог и скинь 5-10 запросов до зависания.
ресурсы не кончились у серва ?

processlist не должен висеть, должно работать ровно

На вскидку, проблемы нет, следует обратиться к админу т.к если база не может - должна сказать что не может, но не виснуть.

С другой стороны, если нагрузка велика , могут быть такие ситуации:
1. при апдейте\инсерте лочится таблица, запросы выстраиваются в очередь. В пике мы увидим "вечно ожидающие" запросы. Тут надо конкретно по ситуации смотреть, часто смотрят какие запросы выполнились перед зависанием. В данном случае рост очереди возможен без перегрузки сервера.
оптимизация запросов, дополнительная индексация как правило спасают

2. ресурсы...
Диагностируется проверкой свободной памяти ( в случае если таблица уже в памяти находится)\процессора. После забивания всей выделенной памяти начинаются жуткие тормоза из-за работа с диском ( гребаный свап) , что еще больше ухудшает ситуацию. В результате получаем длинную очередь и почти мертвый сервер.


3. система.
Сомнительные запросы, которые попали в лог собираем и повторяем всю серию чтобы воспроизвести баг.
Действие не лишние, т.к. если это случайная ошибка сервера или набор байт который крашит базу то время уйдет много. Пока не воспроизведена ошибка, считается что ошибка в запросах\коде.
Полученные будут полезны тому кто настраивал сервер


ЗЫ:
Код:
Ну собственно, вот - случилось... правда в этот раз в самом верху не тот злополучный вопрос, про который я писал выше... Но это не важно - я хочу понять, что мне здесь хотят донести ))
я вот тут подумал, если база висит, то как processlist вывелся ? что понимается под "висит" ?

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

whirlwind

TDD infected, paranoid
полный текст запроса

SELECT id
FROM person
WHERE level = "2" AND
person.id NOT

в студию
 

FractalizeR

Новичок
На вскидку, проблемы нет, следует обратиться к админу т.к если база не может - должна сказать что не может, но не виснуть.
Как это - "сказать"? Таким вот прям скорбным умирающим голосом? :)
 
Вот ещё один процесслист - здесь есть оба запроса к таблице battle...
PHP:
mysql> SHOW FULL PROCESSLIST;
+--------+---------+-----------------+---------+---------+-------+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Id     | User    | Host            | db      | Command | Time  | State          | Info                                                                                                                                                                                                                                                                           |
+--------+---------+-----------------+---------+---------+-------+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 536903 | asteria | 127.0.0.1:53176 | asteria | Query   | 11973 | Locked         | SELECT `date` FROM battle WHERE person_id = 196904 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 536910 | asteria | 127.0.0.1:53183 | asteria | Query   | 11973 | Locked         | SELECT `date` FROM battle WHERE person_id = 12708 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                 |
| 536918 | asteria | 127.0.0.1:53191 | asteria | Query   | 11973 | Locked         | UPDATE battle SET `date` = DEFAULT WHERE id = 6056119                                                                                                                                                                                                                          |
| 536924 | asteria | 127.0.0.1:53197 | asteria | Query   | 11973 | Sorting result | SELECT `date` FROM battle WHERE person_id = 1753 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                  |
| 536925 | asteria | 127.0.0.1:53198 | asteria | Query   | 11973 | Locked         | SELECT DISTINCT(opponent_id)
             FROM battle
             WHERE person_id = 234801 AND
             `date` BETWEEN DATE_SUB(NOW(), INTERVAL 24 HOUR) AND NOW()                                                                                                     |
| 536927 | asteria | 127.0.0.1:53200 | asteria | Query   | 11973 | Locked         | SELECT DISTINCT(opponent_id)
             FROM battle
             WHERE person_id = 234459 AND
             `date` BETWEEN DATE_SUB(NOW(), INTERVAL 24 HOUR) AND NOW()                                                                                                     |
| 536928 | asteria | 127.0.0.1:53201 | asteria | Query   | 11973 | Locked         | INSERT battle
                 SET           person_id = 267255,
                             opponent_id = 1553,
                               is_winner = 1,
                       person_message_id = 13236211,
                     opponent_message_id = 13236212 |
| 536929 | asteria | 127.0.0.1:53202 | asteria | Query   | 11973 | Locked         | UPDATE battle SET `date` = DEFAULT WHERE id = 6056153                                                                                                                                                                                                                          |
| 536930 | asteria | 127.0.0.1:53203 | asteria | Query   | 11973 | Locked         | UPDATE battle SET `date` = DEFAULT WHERE id = 6056189                                                                                                                                                                                                                          |
| 536931 | asteria | 127.0.0.1:53204 | asteria | Query   | 11973 | Locked         | SELECT `date` FROM battle WHERE person_id = 22336 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                 |
| 536933 | asteria | 127.0.0.1:53206 | asteria | Query   | 11973 | Locked         | SELECT `date` FROM battle WHERE person_id = 180851 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 536935 | asteria | 127.0.0.1:53208 | asteria | Query   | 11973 | Locked         | UPDATE battle SET `date` = DEFAULT WHERE id = 6056191                                                                                                                                                                                                                          |
| 536937 | asteria | 127.0.0.1:53210 | asteria | Query   | 11973 | Locked         | SELECT `date` FROM battle WHERE person_id = 219670 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 536938 | asteria | 127.0.0.1:53211 | asteria | Query   | 11973 | Locked         | INSERT battle
                 SET           person_id = 204478,
                             opponent_id = 649,
                               is_winner = 0,
                       person_message_id = 13236214,
                     opponent_message_id = 13236213  |
| 536939 | asteria | 127.0.0.1:53212 | asteria | Query   | 11973 | Locked         | SELECT `date` FROM battle WHERE person_id = 1953 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                  |
| 536941 | asteria | 127.0.0.1:53214 | asteria | Query   | 11972 | Locked         | UPDATE battle SET `date` = DEFAULT WHERE id = 6056005                                                                                                                                                                                                                          |
| 536942 | asteria | 127.0.0.1:53215 | asteria | Query   | 11972 | Locked         | SELECT `date` FROM battle WHERE person_id = 124950 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 536943 | asteria | 127.0.0.1:53216 | asteria | Query   | 11972 | Locked         | SELECT `date` FROM battle WHERE person_id = 2164 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                  |
| 536944 | asteria | 127.0.0.1:53217 | asteria | Query   | 11972 | Locked         | SELECT `date` FROM battle WHERE person_id = 271200 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 536945 | asteria | 127.0.0.1:53218 | asteria | Query   | 11972 | Locked         | INSERT battle
                 SET           person_id = 271181,
                             opponent_id = 1537,
                               is_winner = 1,
                       person_message_id = 13236215,
                     opponent_message_id = 13236216 |
| 536947 | asteria | 127.0.0.1:53220 | asteria | Query   | 11972 | Locked         | SELECT `date` FROM battle WHERE person_id = 171995 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 536949 | asteria | 127.0.0.1:53222 | asteria | Query   | 11972 | Locked         | SELECT `date` FROM battle WHERE person_id = 253879 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 536950 | asteria | 127.0.0.1:53223 | asteria | Query   | 11972 | Locked         | SELECT `date` FROM battle WHERE person_id = 92539 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                 |
| 536952 | asteria | 127.0.0.1:53225 | asteria | Query   | 11972 | Locked         | SELECT `date` FROM battle WHERE person_id = 232840 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 536953 | asteria | 127.0.0.1:53226 | asteria | Query   | 11972 | Locked         | SELECT `date` FROM battle WHERE person_id = 2506 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                  |
| 536955 | asteria | 127.0.0.1:53228 | asteria | Query   | 11972 | Locked         | UPDATE battle SET `date` = DEFAULT WHERE id = 6056161                                                                                                                                                                                                                          |
| 536956 | asteria | 127.0.0.1:53229 | asteria | Query   | 11971 | Locked         | SELECT `date` FROM battle WHERE person_id = 267138 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 536957 | asteria | 127.0.0.1:53230 | asteria | Query   | 11971 | Locked         | SELECT `date` FROM battle WHERE person_id = 3211 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                  |
| 536958 | asteria | 127.0.0.1:53231 | asteria | Query   | 11971 | Locked         | SELECT `date` FROM battle WHERE person_id = 11531 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                 |
| 536961 | asteria | 127.0.0.1:53234 | asteria | Query   | 11971 | Locked         | SELECT `date` FROM battle WHERE person_id = 243552 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 536963 | asteria | 127.0.0.1:53236 | asteria | Query   | 11971 | Locked         | SELECT `date` FROM battle WHERE person_id = 90023 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                 |
| 536964 | asteria | 127.0.0.1:53237 | asteria | Query   | 11971 | Locked         | SELECT `date` FROM battle WHERE person_id = 1509 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                  |
| 536965 | asteria | 127.0.0.1:53238 | asteria | Query   | 11971 | Locked         | UPDATE battle SET `date` = DEFAULT WHERE id = 6056136                                                                                                                                                                                                                          |
| 536966 | asteria | 127.0.0.1:53239 | asteria | Query   | 11971 | Locked         | SELECT `date` FROM battle WHERE person_id = 233409 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 536970 | asteria | 127.0.0.1:53244 | asteria | Query   | 11971 | Locked         | SELECT `date` FROM battle WHERE person_id = 163650 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 536971 | asteria | 127.0.0.1:53245 | asteria | Query   | 11971 | Locked         | INSERT battle
                 SET           person_id = 124021,
                             opponent_id = 4277,
                               is_winner = 1,
                       person_message_id = 13236217,
                     opponent_message_id = 13236218 |
| 536972 | asteria | 127.0.0.1:53246 | asteria | Query   | 11971 | Locked         | SELECT `date` FROM battle WHERE person_id = 221406 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 536973 | asteria | 127.0.0.1:53247 | asteria | Query   | 11970 | Locked         | UPDATE battle SET `date` = DEFAULT WHERE id = 6056163                                                                                                                                                                                                                          |
| 536974 | asteria | 127.0.0.1:53248 | asteria | Query   | 11970 | Locked         | INSERT battle
                 SET           person_id = 262975,
                             opponent_id = 3297,
                               is_winner = 1,
                       person_message_id = 13236219,
                     opponent_message_id = 13236220 |
| 536975 | asteria | 127.0.0.1:53249 | asteria | Query   | 11970 | Locked         | SELECT `date` FROM battle WHERE person_id = 110965 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 536976 | asteria | 127.0.0.1:53250 | asteria | Query   | 11970 | Locked         | SELECT `date` FROM battle WHERE person_id = 234189 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 536977 | asteria | 127.0.0.1:53251 | asteria | Query   | 11970 | Locked         | SELECT `date` FROM battle WHERE person_id = 22861 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                 |
| 536979 | asteria | 127.0.0.1:53253 | asteria | Query   | 11970 | Locked         | SELECT `date` FROM battle WHERE person_id = 2177 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                  |
| 536980 | asteria | 127.0.0.1:53254 | asteria | Query   | 11970 | Locked         | UPDATE battle SET `date` = DEFAULT WHERE id = 6056158                                                                                                                                                                                                                          |
| 536981 | asteria | 127.0.0.1:53255 | asteria | Query   | 11970 | Locked         | UPDATE battle SET `date` = DEFAULT WHERE id = 6056100                                                                                                                                                                                                                          |
| 536982 | asteria | 127.0.0.1:53256 | asteria | Query   | 11970 | Locked         | SELECT `date` FROM battle WHERE person_id = 229124 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 536983 | asteria | 127.0.0.1:53257 | asteria | Query   | 11970 | Locked         | SELECT `date` FROM battle WHERE person_id = 25066 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                 |
| 536984 | asteria | 127.0.0.1:53258 | asteria | Query   | 11970 | Locked         | SELECT `date` FROM battle WHERE person_id = 3861 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                  |
| 536986 | asteria | 127.0.0.1:53260 | asteria | Query   | 11970 | Locked         | SELECT `date` FROM battle WHERE person_id = 185702 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 536988 | asteria | 127.0.0.1:53262 | asteria | Query   | 11970 | Locked         | SELECT `date` FROM battle WHERE person_id = 39590 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                 |
| 536989 | asteria | 127.0.0.1:53263 | asteria | Query   | 11970 | Locked         | SELECT `date` FROM battle WHERE person_id = 259322 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 536990 | asteria | 127.0.0.1:53264 | asteria | Query   | 11970 | Locked         | INSERT battle
                 SET           person_id = 168210,
                             opponent_id = 1577,
                               is_winner = 1,
                       person_message_id = 13236221,
                     opponent_message_id = 13236222 |
| 536992 | asteria | 127.0.0.1:53266 | asteria | Query   | 11969 | Locked         | SELECT `date` FROM battle WHERE person_id = 231623 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 536993 | asteria | 127.0.0.1:53267 | asteria | Query   | 11969 | Locked         | UPDATE battle SET `date` = DEFAULT WHERE id = 6056091                                                                                                                                                                                                                          |
| 536994 | asteria | 127.0.0.1:53268 | asteria | Query   | 11969 | Locked         | SELECT `date` FROM battle WHERE person_id = 16043 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                 |
| 536997 | asteria | 127.0.0.1:53271 | asteria | Query   | 11969 | Locked         | INSERT battle
                 SET           person_id = 262718,
                             opponent_id = 3305,
                               is_winner = 1,
                       person_message_id = 13236223,
                     opponent_message_id = 13236224 |
| 536998 | asteria | 127.0.0.1:53272 | asteria | Query   | 11969 | Locked         | SELECT `date` FROM battle WHERE person_id = 263521 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 537000 | asteria | 127.0.0.1:53274 | asteria | Query   | 11969 | Locked         | SELECT `date` FROM battle WHERE person_id = 70999 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                 |
| 537001 | asteria | 127.0.0.1:53275 | asteria | Query   | 11969 | Locked         | UPDATE battle SET `date` = DEFAULT WHERE id = 6055995                                                                                                                                                                                                                          |
| 537002 | asteria | 127.0.0.1:53276 | asteria | Query   | 11969 | Locked         | SELECT `date` FROM battle WHERE person_id = 143538 ORDER BY `date` DESC LIMIT 1                                                                                                                                                                                                |
| 542774 | root    | 127.0.0.1:61651 | NULL    | Query   |     0 | NULL           | SHOW FULL PROCESSLIST                                                                                                                                                                                                                                                          |
+--------+---------+-----------------+---------+---------+-------+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
61 rows in set (0.00 sec)
Скажите мне пожалуйста, просто я сам не понимаю - гладя на эту таблицу невидно явно в чём проблема ??

-~{}~ 17.09.09 11:27:

whirlwind
да хрен пока с ним... но всё же:
PHP:
'SELECT id
             FROM person 
             WHERE level = "2" AND
             person.id NOT IN(' . implode(', ', $excudeId) . ') LIMIT 500'
где, $excudeId - это как раз то, что выбирается по запросу SELECT DISTINCT(opponent_id) FROM battle WHERE person_id...
Sawa
А что за ослик ?
Серию запросов, выполнившихся перед зависанием брать из бинлога ?
Сам не знаю что подразумевается под висит... следующий раз как он упадёт опять попробую выполнить другие запросы через консоль и посмотреть выполнятся ли они нормально или так же попадут в процесслист
 

Gas

может по одной?
Вася Патриков
если на пальцах, то у тебя происходит следующее: при выполнении select к таблице, запрос очень долго выполняется, это не блокирует другие select-запросы к этой таблице, но только до тех пор, пока не появляется update-запрос. По умолчанию update имеет более высокий приоритет чем select, по-этому select'ы за ним становятся в очередь.
В первом show-листе это запрос, которой ты привёл для whirlwind'а, во втором:

Код:
 SELECT `date` FROM battle WHERE person_id = 1753 ORDER BY `date` DESC LIMIT 1
ссылка на manual

Но, выполняемые запросы крайне просты и планы у них хорошие.
Имхо, дело не в этих запросах, а в сервере, смотри на загрузку cpu, дисковой системы, похоже там всё еле-еле ворочается. Проверь не "побились" ли таблицы, сделай optimize table.
 

Sawa

Новичок
Как это - "сказать"? Таким вот прям скорбным умирающим голосом?
в ерорлоге\сислоге, там слезы всех приложений собираются :D


Серию запросов, выполнившихся перед зависанием брать из бинлога ?
да

Скажите мне пожалуйста, просто я сам не понимаю - гладя на эту таблицу невидно явно в чём проблема ??
Мне нет, я вижу что сложных запросов нет, сервер должен все обработать.
в обоих логах вижу что очередь выстраивает из 60 процессов, изза ожидния разблокировки таблицы. отчего 60 ? ) количество соединений с базой ограничено 60 тредами ? если увеличить скажем до 500 ?
может скрипты отваливаются ? что в ерорлоге языка на котором написан софт ?

Сам не знаю что подразумевается под висит...
А может дело не в базе ? )
мы видим что процессы отобразились, и доступ к базе был получен рутом. Следовательно база не висит, а нормально работает. Если из под рута убить все "висящие" процессы, база "отвисает" ?


ЗЫ: сервер лучше не ребутить. Видел сервер на котором аптайм почти 4 года :D надо фиксить баги
 

FractalizeR

Новичок
Автор оригинала: Sawa
в ерорлоге\сислоге, там слезы всех приложений собираются :D
MySQL вообще-то в лог не пишет отчеты об экстремальных нагрузках. Разве что monit стоит.
 
Gas
Если это решение проблемы, то это хорошо. Но что могло послужить поломкой таблицы ? Я ж не могу каждое утро приходить на работу и проделывать эту процедуру...
PHP:
mysql> CHECK TABLE battle EXTENDED;
+----------------+-------+----------+-----------------------------------------------------------+
| Table          | Op    | Msg_type | Msg_text                                                  |
+----------------+-------+----------+-----------------------------------------------------------+
| asteria.battle | check | warning  | 10 clients are using or haven't closed the table properly |
| asteria.battle | check | error    | Record at: 134079764  Can't find key for index:  2        |
| asteria.battle | check | error    | Corrupt                                                   |
+----------------+-------+----------+-----------------------------------------------------------+
3 rows in set (1 min 38.80 sec)

mysql> ANALYZE TABLE battle;
+----------------+---------+----------+----------------------------------------------------------------------+
| Table          | Op      | Msg_type | Msg_text                                                             |
+----------------+---------+----------+----------------------------------------------------------------------+
| asteria.battle | analyze | Error    | Table './asteria/battle' is marked as crashed and should be repaired |
| asteria.battle | analyze | Error    | Table 'battle' is marked as crashed and should be repaired           |
| asteria.battle | analyze | error    | Corrupt                                                              |
+----------------+---------+----------+----------------------------------------------------------------------+
3 rows in set (0.00 sec)

mysql> REPAIR TABLE battle;
+----------------+--------+----------+----------+
| Table          | Op     | Msg_type | Msg_text |
+----------------+--------+----------+----------+
| asteria.battle | repair | status   | OK       |
+----------------+--------+----------+----------+
1 row in set (41.80 sec)

mysql> CHECK TABLE battle EXTENDED;
+----------------+-------+----------+----------+
| Table          | Op    | Msg_type | Msg_text |
+----------------+-------+----------+----------+
| asteria.battle | check | status   | OK       |
+----------------+-------+----------+----------+
1 row in set (1 min 53.62 sec)

mysql> ANALYZE TABLE battle;
+----------------+---------+----------+----------+
| Table          | Op      | Msg_type | Msg_text |
+----------------+---------+----------+----------+
| asteria.battle | analyze | status   | OK       |
+----------------+---------+----------+----------+
1 row in set (5.65 sec)

mysql> OPTIMIZE TABLE battle;
+----------------+----------+----------+----------+
| Table          | Op       | Msg_type | Msg_text |
+----------------+----------+----------+----------+
| asteria.battle | optimize | status   | OK       |
+----------------+----------+----------+----------+
1 row in set (24.39 sec)
Sawa
Из разговора с нашим админом, на мой вопрос, почему nginx отдаёт 502-ую ошибку, когда мускуль находится в таком состоянии он ответил
а что он должен выдавать когда php-fpm наплодило кучу соединений из-за тормозов к базе и новые не принимает???
Я так пологаю это как то связано с количество "висящих" (или залоченых запросов) в SHOW PROCESSLIST.
 

FractalizeR

Новичок
Так если дело только в количестве соединений - используйте перманентные :)
 
FractalizeR
Server API - CGI/FastCGI, а перманентные соединения используются только при использовании PHP в качестве модуля... да и не в этом вопрос, видимо...
 

Gas

может по одной?
Но что могло послужить поломкой таблицы ?
о, это myisam - тот-же ребут легко может "сломать" большую таблицу (ключи) если в данный момент идёт в неё запись. Могут индексы поломаться и от интенсивного update/insert данных, если нужно ключи перестраивать. Тестил как-то ab -c 100 -n 10000 который дёргал скрипт, делающий 1 insert в таблицу с 15M записей, из нескольких десятков запусков пару раз тоже индексы бились (mysql одна из первых версий ветки 5.1).

-~{}~ 17.09.09 13:50:

Если это решение проблемы, то это хорошо.
так это решение проблемы или всё равно простые запросы "подвисают" ?
 

Sawa

Новичок
Был похожий баг у меня когдато, попробуй поставить в коде :
Код:
ignore_user_abort(true);
В моем случае, данное телодвижение необходимо было для предотвращение прерывания серий запросов к базе. При таймауте отваливался скрипт и тред на базу, раз в некоторый интервал складывалась ситуация, когда по таймауту отваливался скрипт и убивался тред на базу во время апдейта ( событие рандомное ). Вся база после этого вставала т.к. таблица считалась битой(залоченой). В последсвии приходилось чинить таблицу.
Перенастроить сервер админ не хотел, обосновывая решение появлением непредсказуемых багов в системе.
Добавился небольшой код в конфиг, это позволило выполнять "все" запросы, а так же делать mysql_close скриптам которые отваливаются.

Собстно по теме :

по ману mysql:
"134079764 Can't find key for index: 2 " значит что произошло дублировние ключей, либо инлексация ключей слетела. select запросы подобной ошибки вызвать не могут, скорее всего проблема с инсертами\апдейтами.

так же замечу что при больших размерах исходной таблицы( скажем от 200мб) переиндексация занимает время, пока индексируем - база стоит. Я еще не видел чтобы база загибалась на индексации ключей, но :
Код:
KEY `date` (`date`),
  KEY `person_battle` (`person_id`,`date`),
  KEY `person_opponent_date` (`person_id`,`opponent_id`,`date`)
означает что при одном апдейте происходит переиндексация 3х ключей.

ЗЫ. Как быстрый вариант - написать скрипт который будет чекать базу каждую минуту или две, если ответ от таблицы не получен в течении 10 сек, запускаем репейр таблиц. Обычно такие костыли ставят в рабочие проекты, и после, удачно забываются.... оно же работает, зачем выделять время на правки ? :)

-~{}~ 17.09.09 15:11:

MySQL вообще-то в лог не пишет отчеты об экстремальных нагрузках. Разве что monit стоит.
Я не про нагрузку, а ошибки которые в ходе работы проявляются, краши мускла, или ошибки в коде. Софт написанный на коленках может зависнуть в цикле и ничего не сказать, висеть и молчать. Софт вроде мускла должен отписать хотя-бы код ошибки, из-за которой произошел сбой.

Мы определились что оно не совсем висит, просто побило ключи. сори за оффтоп
 
Gas
Сервак опять сдох... видимо починка таблицы не помогла...
Sawa
ignore_user_abort() - насколько я знаю, функция спасает только в тех случаях, если в браузере нажали на кнопку стоп... короче соединение было корректно прервано клиентом - это раз. Во вторых у меня запросы отпраляются к серверу из флеш-приложения, висящего на странице, так что наличие этой функции я думаю меня вовсе не спасёт... впрочем это всё не важно - это костыли. Хотя, пасибо и за эти быстрые решения, но хочется чего то более взвешенного.
А если проблема была бы в незакрывающихся соединениях с мускулем, то тогда и я бы через консоль не мог законектится.
 

fixxxer

К.О.
Партнер клуба
Мыши плакали, кололись, но продолжали юзать MyISAM.

-~{}~ 17.09.09 23:25:

Автор оригинала: Sawa
я всегда боялся InnoDB т.к. если серв запнется... рековер утилиты не спасают
попробуй не отключать бинлоги для разнообразия
 
Сверху