Вася Патриков
Новичок
Видит бог, разработчик думал, прежде чем всё это намутить... просто опыта в этом видимо не так много (печально )))
Извините все, времени не было отписаться... желание разбивать одну таблицу на несколько у меня пока пропало (я вообще с трудом представляю, как это можно внедрить в рабочую систему ))
Так вот, выяснилось, что MySQL-сервер виснет при выполнении запроса (как показал SHOW PROCESSLIST при выполнении его не из под рута) - т.е. этот запрос висит в самом верху таблицы, показываемой по вводу SHOW PROCESSLIST (я так понимаю это определяется так).
Висит он обычно с такими показателями
В DISTINCT запроса попадает примерно 100 записей (и то сомневаюсь).
Ещё к таблице делается три других запроса на выборку - один по первичному ключую, который летает и два других:
Собственно я думаю здесь теперь достаточно информации, чтобы помочь мне или хотя бы ткнуть куда нибудь...
Спасибо
-~{}~ 16.09.09 15:20:
забыл написать, что MySQL "виснит" при выполнении запроса
Извините все, времени не было отписаться... желание разбивать одну таблицу на несколько у меня пока пропало (я вообще с трудом представляю, как это можно внедрить в рабочую систему ))
Так вот, выяснилось, что 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 | Текст запроса
Ещё к таблице делается три других запроса на выборку - один по первичному ключую, который летает и два других:
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();