0

INの計算方法を誰かが説明できるかどうか疑問に思っていますか? 最終的には、このクエリが遅い理由と最適化の方法を見つけようとしています。3 分以上待った後、クエリをキャンセルしたところ、1000 行しか返されなかったので、それほど長くはかからないようです。

SELECT t2.* 
FROM report_tables.roc_test_results as t2 
WHERE t2.job IN (SELECT DISTINCT(t1.job) 
                   FROM report_tables.roc_test_results as t1 
                  WHERE t1.operation = 'TEST' 
                    AND result = 'Passed' 
                    AND STR_TO_DATE(t1.date_created,'%d-%M-%Y') BETWEEN '2009-10-01' 
                                                                    AND '2009-10-31')

総クエリが何を返すべきかわかりません.2000レコード程度だと推測しなければならない場合、サブクエリは332を返します(Distinctでない場合は336)。

このクエリを最適化する方法について誰か教えてもらえますか? また、サブクエリは毎回計算するのですか、それとも一度だけ計算して保存するのですか?

リクエストに応じて、DESC の結果を... (ちなみに、笑わないでください。私は独学なので、このテーブルはひどく設計されていると確信しています。)

Field                     Type               Null     Key    Default    Extra
------                      -----              -----     ---    -------    -----
operation                 varchar(10)         NO   
tester                 varchar(25)            NO   
result                 varchar(45)            NO   
fail_mode              varchar(45)         NO   
primary_failure        varchar(25)           NO   
ref_des                varchar(45)           NO   
rf_hours               varchar(15)          NO   
ac_hours               varchar(15)          NO   
comments               text              NO   
job                    varchar(15)           NO   
rma                    bigint(20) unsigned    NO   
item                   varchar(45)          NO   
item_description       text                  NO   
serial                 varchar(25)            NO   
created_by             varchar(25)            NO   
collection             bigint(20) unsigned    NO    PRI  
date_created           varchar(15)          NO   
4

3 に答える 3

1

列にインデックスを定義する価値がある前に、date_createdデータ型をDATETIMEに変更する必要があります。その理由は、現在のようにデータ型を文字列からDATETIMEに変更する場合、インデックスは無意味になります。

を使用していることLOAD DATA INFILE、およびソースファイルにDD-MON-YY形式の日付が含まれていることを説明しました。 YY-MM-DD形式が使用されている場合、MySQLは暗黙的に文字列をDATETIMEに変換するため、ソースファイルでこれを修正できればLOAD DATA INFILE、残りを使用する前に適切な場所に配置する必要があります。

その後、以下を使用したカバーインデックス。

  • 仕事
  • 手術
  • 結果
  • date_created

...良い考えでしょう。

于 2010-06-04T18:33:05.870 に答える
0

まず第一に、IN はとにかく重複を排除するため、サブクエリの個別は必要ありません。WHERE 句で関数呼び出しが必要ですか。date_created 列にインデックスを付けていますか?

変わるとどうなるか

WHERE STR_TO_DATE(t1.date_created,'%d-%M-%Y') 
BETWEEN '2009-10-01' AND '2009-10-31')

WHERE 1.date_created >= '2009-10-01' 
AND 1.date_created < '2010-01-01'

列で関数を使用すると、インデックスが使用されないことがあります

于 2010-06-04T15:40:27.413 に答える
0

私のアドバイスは、IN を JOIN に置き換えてから、ジョブなどの一部の列にインデックスを追加すること、および操作や結果を追加することを検討することです。MySQL マニュアルのインデックスと、クエリを最適化するための EXPLAIN の使用についても読む必要があります。

http://dev.mysql.com/doc/refman/5.1/en/indexes.html

http://dev.mysql.com/doc/refman/5.1/en/using-explain.html

IN を JOIN に変換する例を次に示します。

SELECT distinct t2.* 
FROM roc_test_results as t2
inner join roc_test_results as t1 on t1.job = t2.job
WHERE t1.operation = 'TEST' 
AND t1.result = 'Passed' 
AND STR_TO_DATE(t1.date_created,'%d-%M-%Y') BETWEEN '2009-10-01' AND '2009-10-31';
于 2010-06-04T16:02:22.430 に答える