У меня есть 2 стола.Правильный способ установки индексов в запросе
первые - таблица t_games (псевдоним г)
column type
g_id mediumint(8)
t_id_1 smallint(5)
t_id_2 smallint(5)
g_team_1 varchar(50)
g_team_2 varchar(50)
g_date datetime
g_live tinyint(3)
Первичный индекс устанавливается на g_id поле и есть дополнительный составной индекс устанавливается на (t_id_1, t_id_2, g_date, g_live) полей.
второй - таблица t_teams (псевдонимы: T1 и T2)
column type
t_id smallint(5)
t_gw_name varchar(50)
gw_cid tinyint(3)
Первичный индекс установлен на t_id.
связь между таблицамиобновленный
Есть две команды на каждой игре. В таблице t_teams есть имена команд. В таблице t_games я сохраняю идентификатор, связанный с t_teams, чтобы получить имя каждой команды, принимающей участие в игре. Таким образом, чтобы извлечь игру ID с именами команд:
SELECT g.g_id, t1.t_gw_name, t2.t_gw_name FROM t_games g
JOIN t_teams t1 ON (g.t_id_1 = t1.t_id)
JOIN t_teams t2 ON (g.t_id_2 = t2.t_id)
Моим SQL-запрос:
SELECT g_id, t_id_1, t_id_2, g_team_1, g_team_2, g_date, g_live, t1.t_gw_name AS t_gw_name_1, t1.gw_cid AS gw_cid_1, t2.t_gw_name AS t_gw_name_2, t2.gw_cid AS gw_cid_2
FROM t_games g
JOIN t_teams t1 ON (t_id_1 = t1.t_id) JOIN t_teams t2 ON (t_id_2 = t2.t_id)
WHERE g.g_date < "2013-07-24 20:00:00" AND g.g_live < 2`
И после того, как объяснить, я получаю: `
1 SIMPLE g ALL t_id_1 NULL NULL NULL 16 Using where
1 SIMPLE t1 eq_ref PRIMARY PRIMARY 2 t_id_1 1
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 2 t_id_2 1`
Я попробовал много комбинации индексации таблицу, но я не могу избавиться от сканирования ALL.
Что такое 'G'? И как другие таблицы относятся к нему? – Strawberry
Я обновил свой вопрос. –
ОК. Вы уверены, что вам нужны все эти столбцы? t_id_1 smallint (5) t_id_2 smallint (5) g_team_1 varchar (50) g_team_2 varchar (50) – Strawberry