【问题标题】:How to use Hibernate to query a MySQL database with indexes如何使用 Hibernate 查询带有索引的 MySQL 数据库
【发布时间】:2013-08-15 20:40:18
【问题描述】:

我有一个基于 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;
}

【问题讨论】:

  • 使用 JPA/Hibernate 真正控制对数据库运行的查询的唯一方法是将其实现为原生 sql-query。在 entitymanager/session 中应该有一个方法来创建这样的查询。您将失去一些可移植性,但作为回报,您可以完全控制针对数据库运行的查询。此外,查询不直接使用索引,它们只是使运行查询更快。如果您添加索引(例如添加到所有外键字段),所有查询都会更快,那些由 hibernate 生成的也是如此..

标签: java mysql hibernate dao indexing


【解决方案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 上设置了索引,数据库将根据查询确定使用该索引是有用的,并因此通过索引知道哪些行具有给定名称。因此,它将只能读取一小部分行来返回查询数据。

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

【讨论】:

  • 非常感谢您的回复。所以我可以为任何需要的列创建索引,实际上不需要修改我的查询代码?执行查询时,MySQL 会确定优化的搜索方式,对吧?
猜你喜欢
  • 2012-08-20
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 2011-11-08
  • 2012-05-01
  • 2015-06-14
相关资源
最近更新 更多