我正在尝试获取每个项目的最新日期。
例如
说我有一张包含供应商,商品,发货日期的表格。我正在检索所有供应商发货的每件商品的最新日期。
数据:
|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。希望找到一种优化行计数查询的方法。任何帮助将不胜感激。
答案 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或表。
这比运行查询两次更快。