2011-12-06 6 views
2

私は同等のコードで見ている巨大なパフォーマンスの違いを理解しようとしています。あるいは、少なくとも私が考えるコードは同等です。MySql:select statmentで@variableを使用すると、何百倍も時間がかかります

私は約1000万レコードのテーブルを持っています。フィールドには、次のように定義されたインデックス付きフィールドが含まれています。 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) 

2つの質問

なぜ@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を使用するかどうかは関係ありません。 2回目にMySQLがキャッシュから結果を取得するため、異なる結果になります。あなたのシナリオをもう一度実行するが、constと@varを使用してクエリを交換すると、同じ結果が得られます(別の値を使用します)。最初は遅くなり、2番目は速くなります。

希望します。

+0

申し訳ありませんが、私は注文を交換し、変更はありません。 @varについて – fishtoprecords

関連する問題