我具有以下性能较慢的查询方法:

@Override
public Map<String, Long> getFeatureCounts() {

    StopWatch timer = new StopWatch();
    timer.start();
    Map<String, Long> resultMap = new LinkedHashMap<String, Long>();  // I want to ensure that the features are in alpha order

    EntityManager em = entityManagerFactory.createEntityManager();

    String jpaQuery = "SELECT F.featureClass, COUNT(DISTINCT F.id) FROM Feature F GROUP BY F.featureClass ORDER BY F.featureClass";
    Query query = em.createQuery(jpaQuery);

    List resultList = query.getResultList();

    for (Object o : resultList) {
        Object[] o2 = (Object[]) o;
        String key = (String) o2[0];
        Long value = (Long) o2[1];
        resultMap.put(key, value);
    }

    em.close();

    timer.stop();
    log.info("getFeatureCounts() executed in " + timer.getTime() + "ms.");

    return resultMap;
}


该表大约有130万条记录,但是在featureClass上有一个索引,而F.id是主键。我正在等待以以下格式返回结果:

机场-> 20316
桥-> 6509
等等

LinkedHashMap是必需项,因此我可以维护键的顺序(既可以这样,也可以稍后再调用Collections.sort()……现在付款还是以后付款)。

表定义如下:

创建表格功能(
    FEATUREID整数,
    FEATURENAME VARCHAR(100),
    FEATURECLASS VARCHAR(100),
    拉特数值(14,5),
    LNG NUMERIC(14,5),
    功能源VARCHAR(10),
    主键(功能编号)
)ENGINE = InnoDB;

在FEATURE(FEATURECLASS)上创建索引idx_featureclass;

任何帮助表示赞赏。

杰森

最佳答案

COUNT(DISTINCT F.id)似乎不必要。 COUNT(1)将给您相同的结果。也许更好的性能;-)。

07-24 19:54