1

我有一个基于 MySQL 开发的应用程序,它通过 Hibernate 连接。我使用 DAO 实用程序代码来查询数据库。现在我需要通过索引优化我的数据库查询。我的问题是,如何通过 Hibernate DAO 实用程序代码查询数据,并确保在执行查询时在 MySQL 数据库中使用索引。对现有示例的任何提示或指针表示赞赏!

更新:只是想让这个问题更容易理解。以下是我用来通过 Hibernate DAO 实用程序代码查询 MySQL 数据库的代码。我在这里没有直接使用 HQL。对最佳解决方案有什么建议吗?如果需要,我会重写数据库查询代码,直接使用 HQL。

    public static List<Measurements> getMeasurementsList(String physicalId, String startdate, String enddate) {

    List<Measurements> listOfMeasurements = new ArrayList<Measurements>();
    Timestamp queryStartDate = toTimestamp(startdate);
    Timestamp queryEndDate = toTimestamp(enddate);

    MeasurementsDAO measurementsDAO = new MeasurementsDAO();
    PhysicalLocationDAO physicalLocationDAO = new PhysicalLocationDAO();
    short id = Short.parseShort(physicalId);
    List physicalLocationList = physicalLocationDAO.findByProperty("physicalId", id);
    Iterator ite = physicalLocationList.iterator();
    while(ite.hasNext()) {
        PhysicalLocation physicalLocation = (PhysicalLocation)ite.next();
        List measurementsList = measurementsDAO.findByProperty("physicalLocation", physicalLocation);
        Iterator jte = measurementsList.iterator();
        while(jte.hasNext()){
            Measurements measurements = (Measurements)jte.next();
            if(measurements.getMeasTstime().after(queryStartDate) 
                    && measurements.getMeasTstime().before(queryEndDate)) {
                listOfMeasurements.add(measurements);
            }
        }
    }

    return listOfMeasurements;
}
4

1 回答 1

1

就像使用 SQL 一样,您不需要做任何特别的事情。只需像往常一样执行查询,如果可能,数据库将使用您创建的索引来优化它们。

例如,假设您有一个 HQL 查询,它搜索具有给定名称的所有产品:

select p from Product where p.name = :name

这个查询将被 Hibernate 翻译成 SQL:

select p.id, p.name, p.price, p.code from product p where p.name = ?

如果您没有设置任何索引product.name,数据库将不得不扫描整个产品表以查找具有给定名称的产品。

如果您在 上设置了索引product.name,则数据库将确定,给定查询,使用此索引很有用,因此由于索引而知道哪些行具有给定名称。因此,它将只能读取一小部分行来返回查询数据。

这对你来说都是透明的。您只需要知道哪些查询足够慢且足够频繁,以证明创建索引以加快它们的速度是合理的。

于 2013-08-15T20:47:39.550 回答