mysql - 如何加速 max(...) 查询

标签 mysql sql spring-data-jpa

我正在尝试加快查询速度:

 @Query("select max(t.timestamp) from TradeDbo t where t.currencyPair.id = :currencyPairId") 
 Date findMaxTimestamp(@Param("currencyPairId") Long currencyPairId); 

实体定义为:

@Entity()
@Table(name = "Trade",
    indexes =  {  @Index(name = "idx_timestamp_currencypairid", 
      columnList = "timestamp,currency_pair_id")}) 
public class TradeDbo extends Auditable<String> {
  @Id @GeneratedValue   
  @Getter private Long id;

  @Version
  private long version;

  @JoinColumn(name = "currency_pair_id")
  @ManyToOne(fetch=FetchType.EAGER) 
  @Getter private CurrencyPairDbo currencyPair;

  @Column(name = "timestamp")
  @Convert(converter = DateConverter.class)
  @Getter private Date timestamp;
...

而且,如您所见,我已经在时间戳/货币对上定义了一个索引(请参阅 how to speed up max() query),我认为这会使 max(timestamp) 只是读取 btree 的最后一页,但是它仍然需要与添加索引之前一样长的时间。

最佳答案

做你的查询

"select max(t.timestamp) from TradeDbo t where t.currencyPair_id = :currencyPairId"

您的复合索引对您的性能没有用,您应该更改列顺序

columnList = "currency_pair_id,timestamp"

首先使用where条件涉及的列..

使用列构建的索引内容用于从左到右阅读

关于mysql - 如何加速 max(...) 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52634053/

相关文章:

mysql - 构成 SQL 语句一部分的二进制哈希?

php - 通过单击 anchor 标记将 PHP 变量发送到另一个页面

sql - 达到总和后停止 SQL 选择

mysql - JpaRepository计数查询QuerySyntaxException实体未映射

java - 无法将投影添加到 envers 查询中的关系字段

php - 从数据库条目中删除 PHP 脚本删除所有条目

mysql - Magento 2.2.6 到 2.3.2 升级问题

php - 从 MYSQL 调用一行

java - 使用 `CrudRepository` 通过键引用添加多对多关系

spring-data - 未传递过滤器参数时的 Spring Data QuerydslBinderCustomizer