У меня есть таблица, которую я использую для рекордов игры для iPhone.На данный момент запрос отключен, поэтому геймеры не могут видеть результаты: - (
Таблица содержит следующие поля:
Type Collation Attributes Null Default Extra Action
id int(11) No auto_increment
date date No
timestamp timestamp No CURRENT_TIMESTAMP
game_id tinyint(4) No
game_size tinyint(4) No
game_level tinyint(4) No
score float No
score_string char(11) utf8_general_ci No
name varchar(50) utf8_general_ci No
place varchar(50) utf8_general_ci No
device varchar(128) utf8_general_ci Yes NULL
Я добавил индекс из двух полей для game_id и game_sizeЭто может быть проблемой, но я не могу понять, почему поиск займет 5 минут ...
Это запрос, который занимает все это время. Другие, более простые запросы также занимали много времени.
SELECT SQL_CALC_FOUND_ROWS name, MIN(score_string) AS Expr1, place FROM
scores WHERE game_id="1" AND game_size = "5" AND game_level = "1"
AND date> "2005-04-14" GROUP BY name, place ORDER BY
MIN(score_string) Limit 0, 100;
Когда я проверяю его в phpMyAdmin, он возвращает 1 секунду, затем несколько 0,0015 секунды, затем снова 1 секунду.
Любая помощь будет более чем приветствоваться. Спасибо! Hanaan
Ниже приводится ОБЪЯСНЕНИЕ для предложенного запроса:
EXPLAIN SELECT name, score_string, place
FROM scores s
WHERE game_id =1
AND game_size =15
AND game_level =1
AND id = (
SELECT id
FROM scores si
WHERE si.game_id =1
AND si.game_size =15
AND si.game_level =1
AND si.name = s.name
AND si.place = s.place
AND si.date > '2005-04-14'
ORDER BY si.game_id, si.game_size, si.game_level, si.name, si.place, si.score_string, si.id
LIMIT 1
)
ORDER BY game_id, game_size, game_level, score_string, id
LIMIT 100
d select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY s ref game_id,indx1,game_id_2 game_id_2 3 const,const,const 14034 Using where
2 DEPENDENT SUBQUERY si ref game_id,indx1,game_id_2 game_id 307 const,const,const,tmi_hcg.s.name,tmi_hcg.s.place 13 Using where
ПОКАЗАТЬ СОЗДАТЬ ТАБЛИЦУ баллов
CREATE TABLE `scores` (
`id` int(11) NOT NULL auto_increment,
`date` date NOT NULL,
`timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP,
`game_id` tinyint(4) NOT NULL,
`game_size` tinyint(4) NOT NULL,
`game_level` tinyint(4) NOT NULL,
`score` float NOT NULL,
`score_string` char(11) NOT NULL,
`name` varchar(50) NOT NULL,
`place` varchar(50) NOT NULL,
`device` varchar(128) default NULL,
PRIMARY KEY (`id`),
KEY `game_id` (`game_id`,`game_size`,`game_level`,`name`,`place`,`score_string`,`id`),
KEY `indx1` (`game_id`,`game_size`,`game_level`,`date`,`id`),
KEY `game_id_2` (`game_id`,`game_size`,`game_level`,`score_string`,`id`)
) ENGINE=MyISAM AUTO_INCREMENT=81564 DEFAULT CHARSET=utf8
Также представляется, что чем ближе дата к сегодняшнему дню, тем дольше будет ответ:
SELECT name, score_string, place
FROM scores s
WHERE game_id =1
AND game_size =15
AND game_level =1
AND id = (
SELECT id
FROM scores si
WHERE si.game_id =1
AND si.game_size =15
AND si.game_level =1
AND si.name = s.name
AND si.place = s.place
AND si.date > "2010-10-01"
ORDER BY si.game_id, si.game_size, si.game_level, si.name, si.place, si.score_string, si.id
LIMIT 1 )
ORDER BY game_id, game_size, game_level, score_string, id
LIMIT 100
Это заняло колоссальные 49 секунд!