2014-09-27 3 views
0

나는 500 만 개의 행 +이있는 테이블을 가지고 있으며 IP를 저장하기 위해 varchar(50) 필드가 있습니다. 나는이 쿼리를 실행하면큰 테이블의 varchar 검색

, 그것은 자원과 시간이 많이 걸립니다 :

SELECT * FROM table WHERE ip = 'xx.xxx.xx.xxx' LIMIT 1 

나는이 과정을 개선하기 위해 무엇을 할 수 있는가? 너무 많은 중복이없는 가정,

create index idx_table_ip on table(ip) 

그런 다음 쿼리가 빠르게 실행해야합니다

+1

해당 쿼리 실행을 중지하십시오. – Strawberry

+0

색인이 있습니까? SELECT *. 특정 필드를 선택하십시오. –

+0

테이블 스키마를 수정할 수있는 경우 IP 열을 UNSIGNED INT로 변경 한 다음 INET_ATON을 변경하여 점으로 구분 된 IP를 4 바이트 UNSIGNED INT IP로 변환하십시오. 방법은 문자열 비교보다 빠릅니다. 해당 열의 색인도 도움이됩니다. http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-aton – Oliver

답변

2

당신은 ip 컬럼에 인덱스가 필요합니다.

마지막 문장을 분명히하겠습니다. 중복은이 쿼리의 실행 시간에 영향을 미치지 않습니다. 그러나 limit을 사용하는 경우 order by을 가져야 결과가 안정됩니다 (두 번 쿼리를 사용하면 같은 행이 반환 됨). 이 경우 색인에 order by 열을 포함해야합니다 (가능한 경우). 그렇지 않은 경우 일치 항목 수가 실적에 영향을줍니다.

+0

감사합니다. 하지만 지금은 또 다른 문제가 있습니다. 'varchar (50)'에서 ip 컬럼을 사용하여 2 개의 테이블 (인덱스 된 int에 의해)을 조인하고'where t1.ip = '..'를 사용합니다. 'OR t2.ip ='.. ''- 많이 걸립니다. 시간의 – HtmHell

+0

@ArielAharonson. . . 질문이 아닌 질문으로 질문해야합니다. 관심있는 쿼리와 테이블 레이아웃을 포함하는 다른 질문을하십시오. –