2013-05-08 2 views
0

나는 여러 테이블을 가지고 있고 그것들에 합류해야합니다. 테이블 중 하나에 200,000 개의 레코드가 있습니다 (이것은 학생 테이블입니다). 또 다른 사람은 1m 이상의 기록을 가지고 있습니다.MySQL이 가능합니다. 너무 많은 시간이 걸리는 필터

학생 입학 연도별로 필터링해야합니다. 이 시나리오에서는 입학 연도가 학생 ID의 처음 두 자리로 주어집니다. 학생 ID는 6 자리 숫자입니다.

예를 들어

: - 1997 년에서 학생들은 ID가 97XXXX - 2011 년 학생들이 그래서, 그 필드을

ID를 B1XXXX - 2005 년에서 학생들은 ID A5XXXX 이 나는 LIKE 문을 사용한다. 올해 1997 년

학생들을 위해

SELECT * FROM STUDENT WHERE id LIKE '97%' 

... 그것은이 쿼리 시간의 끔찍한 양을하고 있음을 밝혀졌습니다. 이는 해당 특정 테이블에 대한 EXPLAIN 출력된다

| id | select_type | table  | type | possible_keys | key | key_len | ref | rows | Extra | 
--------------------------------------------------------------------------------------------+ 
| 1 | SIMPLE  | STUDENTS | range | ID    | ID | 11  | NULL| 6505 | Using where; Using index; Using temporary; Using filesort | 

가 변형 또는 숫자 값으로 올해로 DB에 여분의 열을 추가 정당한가요? 쿼리가 훨씬 빨라질까요?

고맙습니다.

+0

그것은 당신이 인덱스의 경우 새 필드 더 빠르게 실행됩니다. 우리 중 누구도 그것이 합법적인지 아닌지 말할 수있는 입장에 있지 않습니다. 당신은 요구 사항을 아는 사람입니다. –

+0

테이블과 인덱스의 정의는 무엇입니까? 쿼리 란 무엇입니까? 쿼리 계획은 어떻게 생겼습니까? – gillyspy

+0

쿼리 계획에서 EXPLAIN을 의미합니까? – Dynelight

답변

0

id에 대한 색인이 있습니까? MySQL은 그러한 인덱스 (here으로 설명)를 사용하여 쿼리를 최적화 할 수 있어야합니다.

인덱스와

, 당신은 또한 시도 할 수 :

where id >= '97' and id < '98' 
+0

물론 이드는 숫자가 아닙니다. 예를 들어 2006 년 학생을 찾아야하는 경우 해당 ID의 처음 두 자릿수를 조사해야하며 LIKE 성명서로 2006 년부터이 학생을 A6부터 시작합니다. . – Dynelight

+0

@Dynelight. . . 나는 당신의 의견을 이해하지 못합니다. 비교는 숫자뿐만 아니라 문자열에서도 작동합니다. –

+0

2006 년부터 학생들을 만나고 싶습니다. 어떻게 비교 하시겠습니까? – Dynelight

관련 문제