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'

大家好。

以上是我为创建视图而执行的查询。

但我有一个问题如下:

测量值表大约有 8200 万行。测量点表有大约 500 万行测量测试计划和测量测试表有大约 9000 - 100000 行。

我的问题是当我执行上述查询时,执行时间为 8 分钟,生成的结果只有 400 行。

有什么方法可以减少上述查询的执行时间?

注意:我在我的网页中使用上述查询

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 你说你没有在任何表上创建任何索引。所以在WHEREON条件下使用的那些列上创建索引

在你的情况下创建索引

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 回答