optimize block count queries

This commit is contained in:
mononaut 2026-07-14 05:22:32 +00:00
parent a5dceacb42
commit 94f04c0a25
No known key found for this signature in database
GPG key ID: BFD16BE592A9CD8D
2 changed files with 20 additions and 9 deletions

View file

@ -149,6 +149,8 @@ class Mining {
poolsStatistics['lastEstimatedHashrate1w'] = await bitcoinClient.getNetworkHashPs(totalBlock1w);
} catch (e) {
poolsStatistics['lastEstimatedHashrate'] = 0;
poolsStatistics['lastEstimatedHashrate3d'] = 0;
poolsStatistics['lastEstimatedHashrate1w'] = 0;
logger.debug('Bitcoin Core is not available, using zeroed value for current hashrate', logger.tags.mining);
}

View file

@ -327,17 +327,26 @@ class BlocksRepository {
interval = Common.getSqlInterval(interval);
const params: any[] = [];
let query = `SELECT count(height) as blockCount
FROM blocks
WHERE stale = 0`;
if (poolId) {
query += ` AND pool_id = ?`;
let query;
if (!poolId && !interval) {
// optimized query to get full indexed block count
query = `SELECT CAST(COALESCE(MAX(height) - MIN(height) + 1, 0) AS SIGNED) as blockCount FROM blocks`;
} else if (!poolId) {
// optimized query for indexed count within an interval
query = `SELECT GREATEST(0, COALESCE(
CAST((SELECT height FROM blocks WHERE stale = 0 AND blockTimestamp <= NOW() ORDER BY blockTimestamp DESC LIMIT 1) AS SIGNED) -
CAST((SELECT height FROM blocks WHERE stale = 0 AND blockTimestamp >= DATE_SUB(NOW(), INTERVAL ${interval}) ORDER BY blockTimestamp ASC LIMIT 1) AS SIGNED) + 1
, 0)) as blockCount`;
} else {
// for specific pools, we do still have to actually count the blocks
query = `SELECT count(*) as blockCount
FROM blocks
WHERE stale = 0 AND pool_id = ?`;
params.push(poolId);
}
if (interval) {
query += ` AND blockTimestamp BETWEEN DATE_SUB(NOW(), INTERVAL ${interval}) AND NOW()`;
if (interval) {
query += ` AND blockTimestamp BETWEEN DATE_SUB(NOW(), INTERVAL ${interval}) AND NOW()`;
}
}
try {