Php 在查询中使用聚合函数时需要花费大量时间
表有100000条记录,使用聚合函数需要20-21秒。如何优化此查询Php 在查询中使用聚合函数时需要花费大量时间,php,mysql,mysqli,query-performance,Php,Mysql,Mysqli,Query Performance,表有100000条记录,使用聚合函数需要20-21秒。如何优化此查询 SELECT source, sum(product_price*quantity) AS price FROM `sheet` WHERE source !='' GROUP BY source ORDER BY `price` DESC 我还在表中使用了索引 ALTER TABLE `dbname`.`sheet` ADD INDEX `reprting_module` (`source`(30)
SELECT source, sum(product_price*quantity) AS price
FROM `sheet`
WHERE source !=''
GROUP BY source
ORDER BY `price` DESC
我还在表中使用了索引
ALTER TABLE `dbname`.`sheet` ADD INDEX `reprting_module` (`source`(30));
这是解释查询后的输出
首先,您要求您的MySQL服务器在此查询中进行一些计算,然后对结果进行排序。这需要一些时间。它必须检查表中的每一行或几乎每一行。没有什么魔法可以让这些操作瞬间完成 第二,你的来源在哪里!=筛选器可能会破坏您的索引。您可以尝试使用WHERE source>。这将允许MySQL的查询计划器随机访问您的索引,然后按顺序扫描它 第三,子集源索引source30对性能没有帮助 第四,您可以尝试在这些列上创建复合覆盖索引:
ALTER TABLE dbname.sheet
ADD INDEX `reprting_module` (source, product_price, quantity);
然后按如下方式编写查询:
SELECT source, SUM(product_price*quantity) AS price
FROM sheet
WHERE source > ''
GROUP BY source
ORDER BY SUM(product_price*quantity) DESC
如果你幸运的话,这会快一点。为什么?因为MySQL可以通过随机访问第一个非空源值的索引来满足整个查询,然后依次扫描索引以执行计算
请注意,如果您使用
WHERE source = 'some-particular-value'
缩小计算范围。前缀索引,如INDEXsource30,实际上是无用的。请提供“显示创建表”。如果源代码可以是VARCHAR255或更小,只需添加INDEXsource,但这在这里可能没有用处,因为大多数表都需要读取
你有多少公羊?innodb\u buffer\u pool\u size的值是多少?这张桌子有多大?这些问题结合起来询问您是受CPU限制还是受I/O限制,以及一个简单的调优修复程序是否可以将其从I/O更改为CPU,从而可能将其速度提高到2秒。对于仅仅10万行来说,20秒似乎非常高。给我们提供表定义,包括索引功能的索引。.您是否对源进行了索引?如果您将所有行分组,但不包括源=,则可以在服务器端管理此行。.无论有10万条记录,运行以查找我的案例中缺少的标记源类型为text@Sumit-但这需要吗?什么是MAXLENGTHsource?文本的处理效率不如short VARCHARs。是的。现在我的问题解决了。只需将源列的数据类型从TEXT更改为varchar并应用适当的索引。现在只需不到毫秒的时间。