2011-12-06 1 views
2

동일한 코드에서 볼 수있는 엄청난 성능 차이를 이해하려고합니다. 또는 최소한 코드가 같다고 생각합니다.MySql : select statment에서 @variable을 사용하면 수백 배 더 길어집니다.

약 1 천만 개의 레코드가있는 테이블이 있습니다. 여기에는 다음과 같이 정의 된 색인이 포함되어 있습니다. USPatentNum char (8)

MySql을 사용하여 변수에 값을 설정하면 218 초가 걸립니다. 문자열 리터럴과 정확히 같은 쿼리는 1/4 초도 걸리지 않습니다. 리터럴 값 으로 영원히 걸리지 만, 제 (USPatentNum = @pn 어디)와 아래 코드

상기 제 1 선택 문 (USPatentNum = '5288812'는) 거의 순간이다

 
mysql> select @pn := '5288812'; 
+------------------+ 
| @pn := '5288812' | 
+------------------+ 
| 5288812   | 
+------------------+ 
1 row in set (0.00 sec) 


mysql> select patentId, USPatentNum, grantDate from patents where USPatentNum = @pn; 
+----------+-------------+------------+ 
| patentId | USPatentNum | grantDate | 
+----------+-------------+------------+ 
| 306309 | 5288812  | 1994-02-22 | 
+----------+-------------+------------+ 
1 row in set (3 min 38.17 sec) 

mysql> select @pn; 
+---------+ 
| @pn  | 
+---------+ 
| 5288812 | 
+---------+ 
1 row in set (0.00 sec) 


mysql> select patentId, USPatentNum, grantDate from patents where USPatentNum = '5288812'; 
+----------+-------------+------------+ 
| patentId | USPatentNum | grantDate | 
+----------+-------------+------------+ 
| 306309 | 5288812  | 1994-02-22 | 
+----------+-------------+------------+ 
1 row in set (0.21 sec) 

두 가지 질문 :

왜 @pn을 사용하는 것이 훨씬 느린 거죠? 성능이 동일하도록 select 문을 변경할 수 있습니까?

+0

예, 원래 문제 설명에 색인이 생성되었다고 나와 있습니다. – fishtoprecords

+0

은 현명하지 않고 내가 물었던 것의 절반에 대답합니다. 자, 다시 데이터 유형? – gbn

+0

또한 원본 진술서에 있습니다. USPatentNum char (8) – fishtoprecords

답변

1

값을 설정하기 전에 @pn을 char (8)로 선언하십시오.

나는 지금 당신이 그것을 varchar로 의심됩니다. 그렇다면 성능 손실은 MySql이 변수로 인덱스를 처리 할 수 ​​없기 때문입니다.

+0

선언에 어떤 구문을 사용해야합니까? – fishtoprecords

+0

@pn을 varchar (8)로 선언하십시오. – idstam

+0

declare @pn as varchar(8); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'declare 
fishtoprecords

-1

상수 또는 @var를 사용하는지 여부는 중요하지 않습니다. MySQL은 캐시에서 결과를 얻으므로 다른 결과를 얻습니다. 시나리오를 다시 실행하지만 const 대신 및 @var를 사용하여 쿼리를 교환하면 동일한 결과를 얻을 수 있지만 다른 값을 얻을 수 있습니다. 첫 번째는 느려지고 두 번째는 빠를 것입니다.

희망 하시겠습니까?

+0

죄송합니다. 주문을 교체 했으므로 변경 사항이 없습니다. @var에 관한 것 – fishtoprecords

관련 문제