4
SELECT mt.Test_ID,
       mtp.Test_Plan_Doc_No,
       mp.Group_Name,
       mp.Point_Name,
       mp.Limit_1,
       mp.Limit_2,
       mp.Datatype,
       mt.Start_Date,
       mv.Measurement_Value,
       mv.Status_Value
FROM   measurement_test mt
       INNER JOIN measurement_values mv
               ON mt.Test_ID = mv.Test_ID
       INNER JOIN measurement_point mp
               ON mv.Point_ID = mp.Point_ID
       INNER JOIN measurement_test_plan mtp
               ON mtp.Test_ID = mt.Test_ID
WHERE  mtp.Test_Plan_Doc_No IN ( 'test1', 'test2' )
       AND mp.Group_Name = 'gp_name'

こんにちは。

上記は、ビューを作成するために実行しているクエリです。

しかし、次のような問題があります。

測定値テーブルには約 8,200 万行あります。測定ポイント テーブルには約 500 万行の測定テスト プランがあり、測定テスト テーブルには約 9000 ~ 100000 行あります。

私の問題は、上記のクエリを実行すると、実行時間が 8 分で、生成される結果が 400 行しかないことです。

上記のクエリの実行時間を短縮する方法はありますか?

注 : Web ページで上記のクエリを使用しています

4

3 に答える 3

4

まず、効率的joinに行うには、テーブルを行数の昇順で保持する必要があります。これにより、行スキャンの数が大幅に削減されます。したがって、クエリのjoin順序はmeasurement_test mt natural join measurement_point mp natural join measurement_values mv. また、結合列に索引が定義されていること、およびそれらのデータ型が完全に同一であることも確認してください。char(15)varchar(15)は MySQL では類似していると見なされますが、 と は異なりchar(15)ますvarchar(10)

于 2012-08-28T09:03:34.160 に答える
2

あなたからの参照@commentあなたは、どのテーブルにもインデックスを作成していないと言いました。したがって、 WHEREおよびON条件で使用される列に対してCREATE INDEXを実行します。

あなたの場合、インデックスを作成します

mt.Test_ID, 
mv.Test_ID, 
mv.Point_ID,
mp.Point_ID, 
mtp.Test_ID ,
mp.group_name ,
mtp.Test_Plan_Doc_No

ここで私はあなたのクエリを書き直します:

SELECT mt.Test_ID,
       mtp.Test_Plan_Doc_No,
       mp.Group_Name,
       mp.Point_Name,
       mp.Limit_1,
       mp.Limit_2,
       mp.Datatype,
       mt.Start_Date,
       mv.Measurement_Value,
       mv.Status_Value
FROM   measurement_test mt
       INNER JOIN measurement_values mv USING(Test_ID)            
       INNER JOIN measurement_point mp USING (Point_ID)
       INNER JOIN measurement_test_plan mtp USING(Test_ID)
WHERE  mtp.Test_Plan_Doc_No IN ( 'test1', 'test2' )
       AND mp.Group_Name = 'gp_name'
于 2012-08-28T09:05:08.507 に答える
0

WHERE 句で使用される各列に適切なインデックスがあることを確認してください。

クエリ アナライザを使用して、インデックスが使用されているかどうかを確認できます。

于 2012-08-28T08:56:56.573 に答える