2016-08-17 3 views
1

다음 필드가있는 표가 있습니다 : id, sex, age_min, age_max, url.범위가있는 테이블을 인덱싱하는 방법은 무엇입니까?

해당 테이블은 성별, 나이 및 ID별로 필터링됩니다. 일반적인 쿼리는 다음과 같습니다

SELECT `url` FROM foo WHERE (`id` NOT BETWEEN %lim_1% AND %lim_2%) 
AND `sex`=%sex% 
AND `age_min` <= %age% AND `age_max` >= %age% 

내 질문은 : 내가 그렇게 설정해야하는 인덱스 질의 응답 시간이 최적화되어 있는지? 또한 쿼리 자체를 어떻게 든 최적화 할 수 있다면 그 사실을 알고 싶습니다.

+0

나는 그것이'id'이어야한다고 생각합니다. –

+0

@HamzaZafeer 그냥'id'? 나는'url'을 제외한 모든 필드에 인덱스를 추가 할 생각 이었지만 MySQL이 어떻게 관리 할 것인지 모르겠습니다. 아마도 연령대에 대해서도해야 할 일이있을 것입니다. –

+0

IMO DBA.stackexchange.com에 배치하는 것이 더 좋을 수 있습니다. 프로그래밍 고려 사항이 아니라 설계 고려 사항에 관한 것입니다. –

답변

2

이러한 종류의 쿼리는 인덱스를 사용하여 눈부신 속도를 내기가 어렵습니다. age_min <= %age% AND age_max >= %age% 필터링은 쿼리 플래너 나 프로그래머가 깔끔한 작은 인덱스 범위 스캔으로 리팩토링 할 수 없습니다.

따라서 커버 리지 인덱스를 만들어 최상의 결과를 얻으십시오.

sex = %sex%에 등호 필터가있어 색인에서 색인을 가져와야합니다.

age_minage_max에 하프 스캔 범위 필터가 있습니다. 을 알고 있으면 그 중 하나가 다른 것보다 선택 적이라는 것을 알고 있으면 인덱스의 다음 열이되도록 선택하십시오. 그렇지 않으면 두 가지 중 하나를 선택하십시오.

그런 다음 나머지 테이블 열을 인덱스에 포함 시키십시오. 그래서 당신은 얻을 것이다

(sex, age_min, age_max, id, url) 

색인에. 쿼리 플래너는이 인덱스의 일부만 스캔 한 다음 인덱스에서 쿼리를 만족시킬 수 있습니다. 색인을 다루는 을 조회하면이 기술에 대해 자세히 알 수 있습니다.

참고. 필터에 sex = %sex% 절을 포함하지 않으면이 색인은 해당 쿼리를 만족시키는 데 쓸모가 없습니다.

참고. MySQL은 단일 WHERE 절을 만족시키기 위해 하나 이상의 인덱스를 거의 사용하지 않습니다. 따라서 많은 컬럼에 단일 컬럼 인덱스를 두는 것은 결코 좋은 생각이 아닙니다.

참고. 테이블에 몇 백 개 미만의 행이 포함되어 있으면 색인을 생성해도 상처를받을 수는 없지만 많은 도움이되지는 않습니다.

+0

@ 2 번째 메모 - "거의"? MySQL은 언제 단일 WHERE 절에 하나 이상의 인덱스를 사용합니까? –

+1

"Never"는 특히 현재 개발중인 오픈 소스 시스템에 대한 극단적 인 진술입니다. 그러므로 "거의 절대". –

+0

"인덱스 병합"은 천분의 일 미만으로 사용됩니다. 'EXPLAIN SELECT ... '는 그것을 사용할 때 명확하게 보여줍니다. –