减少mysql查询执行时间

时间:2012-08-28 08:52:30

标签: mysql

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行。

有没有办法减少上述查询的执行时间?

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

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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'

答案 2 :(得分:0)

确保WHERE子句中使用的每个列都有适当的索引。

您可以使用查询分析器查看是否使用了索引。