2013-07-28 3 views
1

나는 2 개의 테이블을 가지고 있습니다.쿼리에서 인덱스를 설정하는 올바른 방법

- 테이블 t_games (별명 g)을

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 테이블에서 ID는 t_teams와 관련이 있으며 게임에 참여하는 각 팀의 이름을 검색합니다. 그래서 팀의 이름으로 게임 ID를 retreive합니다 :

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` 

나는 색인의 많은 조합을 시도 테이블,하지만 난 모든 스캔을 제거 할 수 없습니다.

+0

에 대한 낮은 카디널리티 때문에 작업은 매우 효과적 일 수되지 않습니다 모두 열

  • 단일 g_live에 대한 범위 비교를 가지고 있기 때문에이 작동하지 않습니다? 그리고 다른 테이블은 어떻게 그것과 관련이 있습니까? – 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 때문에 (?)

    는 16 행이 테이블에 있습니다
    1. 당신은 이상을 선택하고 ~ 테이블 행의 30 %

    두 경우 모두 인덱스를 사용하는 것보다 모든 테이블을 스캔하는 것이 더 쉽습니다.

    1. t_games 테이블

    PS에서 약 10 행을 반환하는 쿼리를 수행하여 1000 행 같은 것을 함께 t_games 테이블 채우기 : 그래서

    g_date 지수가 작동하는지 확인합니다 :

    1. 복합 색인당신이`g`는 무슨 열
    +0

    DCoder에게 말했듯이, 나는 그 레코드의 수가 중요하다는 것을 잊어 버렸다. 네가 옳아. 테이블에 더 많은 레코드가있는 쿼리를 테스트 해 보겠습니다. –

    관련 문제