Version: 1.0.0
Category: Patterns
Status: Stable
Last Updated: January 1, 2026
This guide provides performance optimization tips for AI agents working with Structs. It covers optimization strategies for reactor staking queries, permission checking, database queries, and caching strategies.
Problem: Querying each reactor individually is slow
Solution: Query all player reactors at once
Before:
{
"approach": "Sequential queries",
"queries": [
"GET /structs/reactor/3-1",
"GET /structs/reactor/3-2",
"GET /structs/reactor/3-3"
],
"time": "3 × query_time"
}
After:
{
"approach": "Batch query",
"query": "GET /structs/reactor?ownerId=1-11",
"time": "1 × query_time",
"improvement": "3x faster"
}
Reference: api/queries/reactor.md, patterns/caching.md
Problem: Reactor staking status changes infrequently
Solution: Cache reactor staking status with appropriate TTL
Strategy:
reactor:{reactorId}:stakingImplementation:
{
"cache": {
"key": "reactor:3-1:staking",
"ttl": 300,
"invalidateOn": [
"reactor-infuse",
"reactor-defuse",
"reactor-begin-migration",
"reactor-cancel-defusion"
]
}
}
Reference: patterns/caching.md, schemas/entities/reactor.md
Problem: Checking multiple reactors sequentially is slow
Solution: Check reactor statuses in parallel
Before:
{
"approach": "Sequential",
"time": "n × query_time",
"reactors": ["3-1", "3-2", "3-3"]
}
After:
{
"approach": "Parallel",
"time": "1 × query_time",
"reactors": ["3-1", "3-2", "3-3"],
"improvement": "n× faster"
}
Reference: patterns/workflow-patterns.md#/parallel-patterns
Problem: Permission checks require API queries
Solution: Cache permission values with appropriate TTL
Strategy:
permission:{permissionId}Implementation:
{
"cache": {
"key": "permission:0-1@1-11",
"ttl": 300,
"invalidateOn": [
"permission-grant",
"permission-revoke"
]
}
}
Reference: patterns/caching.md, api/queries/permission.md
Problem: Checking multiple permissions sequentially is slow
Solution: Query permissions by object or player
Before:
{
"approach": "Individual queries",
"queries": [
"GET /structs/permission/0-1@1-11",
"GET /structs/permission/0-1@1-12",
"GET /structs/permission/0-1@1-13"
]
}
After:
{
"approach": "Batch query",
"query": "GET /structs/permission/object/0-1",
"filters": ["1-11", "1-12", "1-13"],
"improvement": "Single query for all permissions"
}
Reference: api/queries/permission.md, patterns/caching.md
Problem: String conversion and parsing is slow
Solution: Use bitwise operations directly
Before:
{
"approach": "String parsing",
"steps": [
"Parse permission.value to integer",
"Check bit 64",
"Return result"
]
}
After:
{
"approach": "Bitwise operations",
"check": "(permissionValue & 64) == 64",
"improvement": "Direct bitwise check, no parsing"
}
Reference: schemas/game-state.md#/definitions/Permission
Problem: Queries return destroyed structs unnecessarily
Solution: Always filter by destroyed = false
Before:
SELECT * FROM struct WHERE owner_id = '1-11';
-- Returns destroyed structs too
After:
SELECT * FROM struct
WHERE owner_id = '1-11'
AND destroyed = false;
-- Only active structs
Reference: schemas/database-schema.md#/tables/struct, troubleshooting/edge-cases.md
Problem: Permission hash queries are slow
Solution: Use indexed queries for permission_hash
Strategy:
permission_hash level in database queriesImplementation:
SELECT * FROM view.permission
WHERE permission_hash = true
AND object_id = '0-1';
-- Uses permission_hash index
Reference: schemas/database-schema.md, api/queries/permission.md
Problem: Database queries are expensive
Solution: Cache database query results
Strategy:
db:{table}:{query_hash}Implementation:
{
"cache": {
"key": "db:struct:owner_1-11",
"ttl": 30,
"invalidateOn": [
"struct-build-initiate",
"struct-build-complete",
"struct-destroy"
]
}
}
Reference: patterns/caching.md, schemas/database-schema.md
Problem: Struct type queries are frequent but data changes rarely
Solution: Cache struct type data with long TTL
Strategy:
struct-type:{typeId}Implementation:
{
"cache": {
"key": "struct-type:14",
"ttl": 3600,
"data": {
"cheatsheet_details": "...",
"cheatsheet_extended_details": "..."
}
}
}
Reference: schemas/database-schema.md#/tables/struct_type, patterns/caching.md
Problem: Permission hash checks require database queries
Solution: Cache permission hash status
Strategy:
permission-hash:{objectId}@{playerId}Implementation:
{
"cache": {
"key": "permission-hash:0-1@1-11",
"ttl": 300,
"value": true,
"invalidateOn": ["permission-grant", "permission-revoke"]
}
}
Reference: schemas/database-schema.md, patterns/caching.md
Problem: Checking if struct is destroyed requires queries
Solution: Cache destroyed status with short TTL
Strategy:
struct:{structId}:destroyedImplementation:
{
"cache": {
"key": "struct:5-1:destroyed",
"ttl": 10,
"value": false,
"note": "Account for StructSweepDelay (5 blocks)"
}
}
Reference: lifecycles/struct-lifecycle.md#/structsweepdelay, patterns/caching.md
Problem: Sequential requests are slow
Solution: Execute independent requests in parallel
Strategy:
Reference: patterns/workflow-patterns.md#/parallel-patterns
Problem: Polling for real-time data is inefficient
Solution: Use streaming API for frequently-changing data
Strategy:
Reference: patterns/polling-vs-streaming.md
Problem: Exceeding rate limits causes failures
Solution: Monitor rate limit usage and throttle requests
Strategy:
Reference: patterns/rate-limiting.md
Cache static and slowly-changing data with appropriate TTLs.
Execute independent requests in parallel when possible.
Always filter queries to return only needed data.
Track performance metrics to identify bottlenecks.
Use streaming API for real-time data instead of polling.
Batch similar operations together when possible.
Use bitwise operations directly for permission checks.
caching.md - Caching strategiesrate-limiting.md - Rate limit handlingworkflow-patterns.md - Parallel patternspolling-vs-streaming.md - Data update strategies../troubleshooting/reactor-staking-issues.md - Reactor staking troubleshootingLast Updated: January 1, 2026