PHP-MySQL 1.000.000记录查询优化
谢谢你花时间回答我的问题,如果已经有人问过类似的问题,我也很抱歉 我有以下DB的示意图: 我对数据库只有选择权限。 在当前设置下,我的查询通常会从2-3秒运行到10秒。 我被要求优化到当前配置的最佳结构,我的SQL如下所示:(我需要获得所有订单(间隔1个月)内每个产品的总收入) 我曾考虑过通过修改SQL来对PHP端的数据进行分块,但不确定这是否有效 如果可以优化的话,我很想听听你的意见:) 韩国, 笨蛋 附言。 解释结果:PHP-MySQL 1.000.000记录查询优化,php,mysql,Php,Mysql,谢谢你花时间回答我的问题,如果已经有人问过类似的问题,我也很抱歉 我有以下DB的示意图: 我对数据库只有选择权限。 在当前设置下,我的查询通常会从2-3秒运行到10秒。 我被要求优化到当前配置的最佳结构,我的SQL如下所示:(我需要获得所有订单(间隔1个月)内每个产品的总收入) 我曾考虑过通过修改SQL来对PHP端的数据进行分块,但不确定这是否有效 如果可以优化的话,我很想听听你的意见:) 韩国, 笨蛋 附言。 解释结果: 字段订单。项目和订单。客户是否被索引?如果使用Phpmyadmin创建
字段
订单。项目和订单。客户是否被索引?如果使用Phpmyadmin创建表,则必须将字段指定为索引以及将具有的关系,因此,当您使用连接进行类似的查询时,查询最适合搜索
当然,您可以更改表并设置索引等字段,但它们必须是相同的类型,否则关系将无法指定!示例您的主键
和外键
必须是INT UNSIGNED
我希望你认为这个答案是有用的。 一般来说,你的性能问题是由于对“订单”
的全表扫描而造成的。
奇怪的是,对于一个小数据集(~10MB)来说,运行时间如此之长。在我的服务器上执行类似的查询大约需要1秒钟
尝试优化数据类型以适应较小的数据大小。
(对于索引,必须使用int)
检查订单。数据是否有索引
检查订单。数据类型是否为日期,以提高索引性能
在所有情况下,您都在使用一些聚合函数(group和sum),这些类型的函数非常昂贵,因为服务器首先生成一个包含所有数据的大表,然后执行聚合函数
如果您的性能问题是由于服务器配置(工作负载、ram或…)造成的,您可以缓存结果,以避免每次重新计算所有结果。是否有日期索引列(也包括项目、客户端)?这些表上有哪些索引?解释对此查询显示了什么?您应该从获取解释计划开始。但是如果不允许您创建索引,那将很有趣。您的查询中没有任何无关的内容,获取所需的数据是正确的。此处的性能可能与相关表上的索引有关,请运行EXPLAIN以查找瓶颈。如果您的条件列上没有索引,并且不允许更改数据库结构,则可以生成运行时索引、查询并释放索引。这是一个有点昂贵的解决方案,但可以在不改变数据库结构的同时缩短查询时间。
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`