2017-08-02 82 views
1

感谢花在了我的问题,对不起,如果它已经时间已经问过类似的东西。PHP - MySQL的1.000.000记录查询优化

我有一个DB的下面的示意图:

db scheme

我只为DB SELECT权限。 而我的查询往往会在当前设置下运行2-3秒到10秒。 有人问我,优化至最佳配置的当前结构和我的SQL是这样的:(我需要获得所有的订单,其为1个月的间隔内对每种产品的总收入)

SELECT items.`type` AS type, 
    DATE(orders.date) AS date, 
    sum(items.price * orders.quantity * clients.discount_percent/100) AS total 
    FROM orders 
INNER JOIN items ON orders.item = items.id 
INNER JOIN clients ON orders.`client` = clients.id 
GROUP BY DATE(orders.date), items.`type` 

我正在考虑通过修改SQL方面的数据来处理结果 - 但不确定它是否会有效。

很想听听形成雅,如果这可以优化:)。

KR, 昏头昏脑

附: EXPLAIN结果: EXPLAIN

+0

你有索引日期列(也是项目,客户端)吗? – Maadinsh

+1

你对这些表有什么指标? EXPLAIN为这个查询显示什么? –

+1

你应该从获得解释计划开始。但是,如果你不被允许创建索引,它会很有趣。 –

回答

0

字段orders.itemorders.client被索引?如果你用Phpmyadmin创建一个表,你必须指定这些字段作为索引和关系,所以当你使用JOIN这样的查询时,查询是最适合搜索的。

当然你也可以ALTER你的表,并设置像INDEX领域,但他们必须是同一类型或关系将不能especified的!示例您的PRIMARY KEYFOREIGN KEY必须是INT UNSIGNED

我希望你认为这个答案有用。

0

一般来说,你的性能问题是一个全表扫描,由于在“订单”

很奇怪一个这么大的运行时间为一个小的数据集(〜10MB)。我的服务器上的类似查询需要1秒或更短的时间。

尝试优化数据类型,以适应更小的数据尺寸。 (对于索引,你必须使用int)。

检查Orders.Data是否有索引。

检查Orders.Data是Date类型,以提高索引性能。

在所有的情况下,您使用的是一些聚合函数(组和总和),这些类型的功能是非常昂贵的,因为服务器首先生成一个大表中的所有数据后执行聚合函数。

如果您的性能问题是由于服务器配置(工作量,RAM或......),你可以缓存结果以避免重新计算每次所有结果。