如何优化id和限制对mysql中大数据的查询?

我在mysql表中有十亿行,我想用索引字段查询该表,比如说时间戳。

我想查询最近7天的数据,该数据大约可以是1000000行,我要根据获取的最后一个id和500的限制进行查询。

当我处理多达5000000行的数据(即10000个查询)时,此查询工作正常,但是当我将查询数量增加到50000个时,随着时间的推移,性能会下降。查询从一开始就需要5到10毫秒,但运行很长时间后,它降级为2秒钟。我该如何优化呢?

我早些时候尝试过一个天真的解决方案,它是极限,偏移量,它给出了高度未优化的结果,所以我尝试通过在每次查询时保存最后一个id并添加最后一个id来对其进行优化,但是如果我继续获取一个,那么性能会随着时间的推移而降低持续3-4个小时。

JAVA:使用休眠和切片

Date date = new Date();
Date timestamp = new DateTime(date).minusDays(7).toDate();

while (true) {
    Integer rowLimit = 500;
    Sort.Order sortingOrder = Sort.Order.asc("timestamp");
    Sort sort = Sort.by(sortingOrder);

    Pageable pageable = PageRequest.of(0,rowLimit,sort);

    long queryStartTime = System.currentTimeMillis();

    entityDataSlice = repository.findAllByTimestampAfterAndIdGreaterThan(
          timestamp,lastId,pageable
    );

    long queryEndTime = System.currentTimeMillis();

    if (!entityDataSlice.hasnext()) {
          break;
    }
}

MYSQL:

select *  
 from table 
where timestamp >= "some_time" 
  and id >= <some_id> 
order 
   by timestamp 
limit 500

预期结果是性能优化,但是超时会降低性能。

预计最长可延长100毫秒,但实际上最长可达2-3秒,这很可能会进一步降低直至5-10秒

kobechf301 回答:如何优化id和限制对mysql中大数据的查询?

请提供SHOW CREATE TABLE。同时,如果您有INDEX(timestamp),则不需要and id...。实际上,它可能会妨碍优化ORDER BY

因此,如果您的查询是这样:

select  *
    from  table
    where  timestamp >= "some_time"
    order by  timestamp
    limit  500

您拥有INDEX(timestamp),然后对其进行了优化,并且不会减慢速度(除了缓存问题)。

如果这只是“真实”查询的简化版本,那么所有选择都将关闭。

本文链接:https://www.f2er.com/3134858.html

大家都在问