2013-07-28 2 views
1

У меня есть 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.

+0

Что такое 'G'? И как другие таблицы относятся к нему? – Strawberry

+0

Я обновил свой вопрос. –

+0

ОК. Вы уверены, что вам нужны все эти столбцы? t_id_1 smallint (5) t_id_2 smallint (5) g_team_1 varchar (50) g_team_2 varchar (50) – Strawberry

ответ

1

В вашем случае (для запроса, который вы указали) вам нужен только индекс, который содержит номер номер, номер g_date.

В то время как вы видите ALL, потому что: (?)

  1. Есть только 16 строк в таблице
  2. Вы выбираете более чем на ~ 30% строк таблицы

В обоих случаях легче сканировать всю таблицу, а не использовать индекс.

Так, чтобы проверить, что g_date индекс работы:

  1. Заполните t_games таблицу с чем-то вроде 1000 строк
  2. Выполните запрос, который будет возвращать около 10 строк из t_games таблицы

PS:

  1. комбинированный указатель (g_date, g_live) не будет работать, потому что у вас есть сравнение диапазонов для обеих колонок
  2. одного g_live не работы быть очень эффективным, потому что это низкая мощность для этого столбца
+0

Как я уже сказал DCoder, я забыл о том, что количество записей имеет значение. Ты прав. Я проведу запрос с большим количеством записей в таблице. –

Смежные вопросы