Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在查询中使用聚合函数时需要花费大量时间_Php_Mysql_Mysqli_Query Performance - Fatal编程技术网

Php 在查询中使用聚合函数时需要花费大量时间

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)

表有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));  
这是解释查询后的输出


首先,您要求您的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并应用适当的索引。现在只需不到毫秒的时间。