私は同等のコードで見ている巨大なパフォーマンスの違いを理解しようとしています。あるいは、少なくとも私が考えるコードは同等です。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文を変更できますか?
はい、元の問題文ではインデックスが作成されています。 – fishtoprecords
はスマートではなく、私が尋ねたものの半分に答えます。もう一度、データ型? – gbn
も元の記載です。 USPatentNum char(8) – fishtoprecords