关于搜索
数据库中的index
需要平衡考虑:
- 索引会使查询更快
- 索引会使持续化更慢
这需要我们具体个例具体衡量。
- 一般来讲95%的请求都应还有index,多个条件的请求,必须有一个带有index。
- LIKE的比对中不应将通配符方在前面,这会引发全局扫描,如果非要这样,应必须带有其他index的条件。
- OR的效率没有AND的高
- 待用index的条件应该放置在前面
- 唯一约束提供检索效率,UNIQUE KEY不仅仅是确保唯一,还可以有效提供定位记录。
学习三种检索方式
是否使用索引和使用多少索引,取决于数据读写的比例。我们将学习下面三种检索方式:
- 复杂查询中使用简单索引:基于动态查询(用户可能选择某几项,各项之间可能是AND关系也可能是OR的关系,指定的排序),最好的方式是采用criteria API
- 使用数据库厂商索引的全文本搜索
- 使用Apache Lucene和Hibernate Search的全文本搜索
Criteria JPA的动态搜索小例子
这是原来的标准JPA接口的代码例子:
public Book getByIsbn(String isbn){
CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
CriteriaQuery<Book> query = builder.createQuery(this.entityClass);
Root<Book> root = query.from(this.entityClass);
return this.entityManager.createQuery( query.select(root)
//【注意】where本身是可以带多个条件的:CriteriaQuery.where(Predicate... restrictions)
.where(builder.equal(root.get("isbn"), isbn)))
.getSingleResult();
}
我们需要做的是:
- 利用CriteriaQuery.where(Predicate... restrictions)带入我们的动态查询的多个条件
- 提供一个通用的动态查询方法,而不是指定具体类型,如Book或者Person。
相关链接:我的Professional Java for Web Applications相关文章