Mysql查询-更快?
所以我有一个MySQL查询,由于我有很多记录,速度变得非常慢,使用该软件的计算机(收银机)也没有那么强大。 有没有办法得到同样的结果,但更快?非常感谢您的帮助Mysql查询-更快?,mysql,sql,Mysql,Sql,所以我有一个MySQL查询,由于我有很多记录,速度变得非常慢,使用该软件的计算机(收银机)也没有那么强大。 有没有办法得到同样的结果,但更快?非常感谢您的帮助 SELECT d.sifra, COUNT(d.sifra) AS pogosti, c.*, s.Stevilka as Stev_sk FROM Cenik c, dnevna d, Podskupina s WHERE d.sifra = c.Sifra AND d.datum >= DATE(DATE_SUB(NOW(),
SELECT d.sifra, COUNT(d.sifra) AS pogosti, c.*, s.Stevilka as Stev_sk FROM Cenik c, dnevna d, Podskupina s
WHERE d.sifra = c.Sifra AND d.datum >= DATE(DATE_SUB(NOW(),INTERVAL 3 DAY))
GROUP BY d.sifra ORDER BY pogosti DESC limit 27
你试过索引吗 您在WHERE中使用c.Sifra,因此您可能需要
CREATE INDEX Cenik_Sifra ON Cenik(Sifra);
您还可以使用来自dnevna的数据和sifra,数据是您的选择,所以
CREATE INDEX dnevna_ndx ON dnevna(datum, sifra);
最后,在Podskupina上没有连接条件,你从那里画Stevilka。这是一张固定的桌子吗?实际上,您只是在计算Podskupina中的行数和/或从中获取一个未指定的值,除非它只有一行
在MySQL的某些版本上,您可能会发现预计算数据的好处:
SELECT @datum := DATE(DATE_SUB(NOW(), INTERVAL 3 DAY))
然后在查询中使用@datum。这可能会提高其获得良好索引性能的机会
但是,如果不了解更多有关表的结构和基数的信息,就很难做到这一点
至少你应该把结果公布出来
EXPLAIN SELECT...(your select)
在问题中。您没有条件加入Podskupina s,您得到了交叉连接(all to all),因此您从join“d.sifra=c.sifra”中得到x行,乘以Podskupina s的y行这看起来是一个非常有问题的查询。您真的需要返回所有的c.*?Podskupina上的连接或过滤器在哪里?收紧查询后,请确保在表上创建了良好的索引。例如,假设您已经在一个唯一ID上获得了一个聚集索引作为dnevna中的主键,那么在sifra和DATA列上放置一个辅助索引通常会提高性能 与s交叉连接有什么意义?您不能交叉连接,只需乘以s中的行数,就可以得到相同的计数。要得到更具体的答案,请提供相关表格的定义和一些相关的示例数据。简单规则:在
FROM
子句中不要使用逗号;始终使用显式的JOIN
语法。我不知道我怎么会错过这个,但正如你所说,预先计算日期已经产生了巨大的影响!现在足够快了!问题是查询是在填充按钮的循环中使用的,这使得查询速度非常慢。。但现在一切都好了,多亏了你。无论如何,谢谢你的帮助!!