优化查询以返回行数

时间:2014-11-28 16:17:33

标签: mysql sql optimization

我正在尝试获取每个项目的最新日期。

例如

说我有一张包含供应商,商品,发货日期的表格。我正在检索所有供应商发货的每件商品的最新日期。

数据:

|Vendor|item   |shipmentDate|
|HP    |laptop | 2014/07/29 |
|HP    |laptop | 2014/06/28 |
|Apple |tablet | 2014/05/05 |
|Apple |tablet | 2014/06/28 |

获取最新日期查询:

SELECT Vendor, item, MAX(shipmentDate) 
FROM table 
GROUP BY Vendor, item;

结果:

|Vendor|item   |shipmentDate|
|HP    |laptop | 2014/07/29 |
|Apple |tablet | 2014/06/28 |

一切都很好。但是,对于上述查询,我​​的实际表格将产生超过50,000条记录。所以我试图从我的JAVA应用程序批量执行查询。因此,我试图检索数据的行数:

SELECT COUNT(*)
FROM (SELECT Vendor, item, MAX(shipmentDate) 
    FROM table 
    GROUP BY Vendor, item) T;

行计数查询需要:00:04:47与其他查询相同的时间:00:04:43。希望找到一种优化行计数查询的方法。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

尝试这样做:

select count(distinct vendor, item)
from table;

这个可能table(vendor, item)上的索引更快。如果MySQL将利用此查询的索引,我不是100%。

答案 1 :(得分:1)

我只想建议使用DISTINCT获取计数,也许它会产生更好的结果:

select count(Vendor) from
(select distinct Vendor, item
from  table)

答案 2 :(得分:1)

您可以使用MySQL的非标准SQL_CALC_FOUND_ROWS选项。

首先查询:

SELECT SQL_CALC_FOUND_ROWS Vendor, item, MAX(shipmentDate) 
FROM table 
GROUP BY Vendor, item;

第二次查询:

SELECT FOUND_ROWS();

答案 3 :(得分:0)

我建议只运行查询

    SELECT Vendor, item, MAX(shipmentDate) 
    FROM table 
    GROUP BY Vendor, item

并将结果放在ResultSet中(如果您使用的是Java),意味着将它们存储在表格中,如数据结构(缓存它们),并使用API​​的内置方法将它们计算在内,计算ResultSet或表。

这比运行查询两次更快。