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行。
有没有办法减少上述查询的执行时间?
注意:我在网页上使用上述查询
答案 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子句中使用的每个列都有适当的索引。
您可以使用查询分析器查看是否使用了索引。