mysql查询中select语句的计算速度较慢

mysql查询中select语句的计算速度较慢,mysql,performance,Mysql,Performance,我在Mysql select语句中进行了计算。我发现这会使查询变慢 SELECT MIN(a) AS MIN, ROUND(100*(a/b), 1) AS mos FROM TABLE_NAME WHERE a > 0 AND b > 0 AND c <= 148 AND d >=-100 HAVING mos <= 300.1 选择最小值(a)作为最小值, 四舍五入(100*(a/b),1)为mos 从表\u名称 其中a>0 b>0

我在Mysql select语句中进行了计算。我发现这会使查询变慢

SELECT MIN(a) AS MIN,
       ROUND(100*(a/b), 1) AS mos
FROM TABLE_NAME
WHERE a > 0
  AND b > 0
  AND c <= 148
  AND d >=-100 HAVING mos <= 300.1
选择最小值(a)作为最小值,
四舍五入(100*(a/b),1)为mos
从表\u名称
其中a>0
b>0
c=-100,mos为0
b>0
c=-100

我已经为a、b、c、d创建了索引。有任何建议如何使它更快?

< P>如果是<代码> MOS < /代码>计算,结果是你的速度问题的来源,你可能想考虑把它作为一个额外的列,你在插入和更新之前进行计算,而不是每次运行这个查询时都要重新计算它。 您可以在更新数据库的代码中手动执行此操作,或者如果您使用支持触发器的mysql版本,我认为您应该能够创建一个触发器来自动更新列

例如,插入触发器可能如下所示:

CREATE TRIGGER ins_mos BEFORE INSERT ON TABLE_NAME
FOR EACH ROW SET NEW.mos = ROUND(100*(NEW.a/NEW.b), 1);

您确定在第二种情况下查询的总时间更快,还是只看到第一个结果更快?在第一个查询中对整个表的聚合将阻止返回第一行,直到对所有行计算了MIN()。另外,为什么
?第一次查询在所有行中选择
a
的最小值(
MIN
是一个聚合函数),再加上它查询的第一行的
a%的b
ROUND
不是一个聚合函数)。@joachimiaksson,我试过几次运行这两个查询。第一次大约需要0.15秒。第二个将花费0.05秒。@EdGibbs,我试图删除作为mos部分的
轮(100*(a/b),1)。速度是一样的。首先决定你想要实际计算和描述什么,用文字或几个行的例子和想要的输出。然后我们可以找到一个返回所需结果的查询。只有这样,才能处理效率问题。
CREATE TRIGGER ins_mos BEFORE INSERT ON TABLE_NAME
FOR EACH ROW SET NEW.mos = ROUND(100*(NEW.a/NEW.b), 1);