所以我有这个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(),INTERVAL 3 DAY))
GROUP BY d.sifra ORDER BY pogosti DESC limit 27
答案 0 :(得分:0)
您是否尝试过索引?
你在WHERE中使用c.Sifra,所以你可能想要
CREATE INDEX Cenik_Sifra ON Cenik(Sifra);
你也使用dnevna的datum和sifra,而datum是你的SELECT,所以
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)
问题。
答案 1 :(得分:0)
你没有条件加入Podskupina,你得到交叉加入(全部都是),所以你从加入得到x行" d.sifra = c.Sifra"乘以y行的Podskupina s
答案 2 :(得分:0)
这看起来像一个非常有问题的查询。你真的需要归还所有的c。*? Podskupina的加入或过滤器在哪里?一旦收紧查询,请确保已在表上创建了良好的索引。例如,假设您已经在唯一ID上获得了聚合索引作为dnevna中的主键,性能通常会通过在sifra和datum列上放置二级索引而获益。