我在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秒