如何加速max(…)查询

vi4fp9gy  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(328)

我有一个缓慢的问题,我正试图加快:

@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;
...

如您所见,我已经在timestamp/currencypairid上定义了一个索引(请参阅如何加速max()查询),我原以为max(timestamp)只是读取btree的最后一页,但它仍然需要与添加索引之前一样长的时间。

vh0rcniy

vh0rcniy1#

按以下步骤进行查询:

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

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

columnList = "currency_pair_id,timestamp"

首先使用where条件中涉及的列。。
使用列构建的索引内容用于从左到右读取

相关问题