feat: optimize dashboard and workload queries with database indexes and SQL aggregation for improved performance
Add database indexes on ip_addresses.address and traffic_flows columns (node_id/source_ip/destination_ip/destination_port/state with updated_at) to accelerate query performance, implement ensure_runtime_indexes to create indexes on startup with IF NOT EXISTS guards, rewrite dashboard_top_talkers to use SQL aggregation with JOIN on IpAddress/TrafficFlow instead of Python loops over all
This commit is contained in:
@@ -2,7 +2,7 @@ from datetime import datetime
|
||||
from enum import StrEnum
|
||||
from uuid import uuid4
|
||||
|
||||
from sqlalchemy import JSON, BigInteger, Boolean, DateTime, Enum, ForeignKey, Integer, String, Text, UniqueConstraint
|
||||
from sqlalchemy import JSON, BigInteger, Boolean, DateTime, Enum, ForeignKey, Index, Integer, String, Text, UniqueConstraint
|
||||
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||
|
||||
from app.db.session import Base
|
||||
@@ -185,7 +185,10 @@ class Subnet(Base, TimestampMixin):
|
||||
|
||||
class IpAddress(Base, TimestampMixin):
|
||||
__tablename__ = "ip_addresses"
|
||||
__table_args__ = (UniqueConstraint("subnet_id", "address"),)
|
||||
__table_args__ = (
|
||||
UniqueConstraint("subnet_id", "address"),
|
||||
Index("ix_ip_addresses_address", "address"),
|
||||
)
|
||||
|
||||
id: Mapped[str] = mapped_column(String, primary_key=True, default=new_id)
|
||||
subnet_id: Mapped[str] = mapped_column(ForeignKey("subnets.id"), index=True)
|
||||
@@ -197,6 +200,13 @@ class IpAddress(Base, TimestampMixin):
|
||||
|
||||
class TrafficFlow(Base, TimestampMixin):
|
||||
__tablename__ = "traffic_flows"
|
||||
__table_args__ = (
|
||||
Index("ix_traffic_flows_node_updated", "node_id", "updated_at"),
|
||||
Index("ix_traffic_flows_source_updated", "source_ip", "updated_at"),
|
||||
Index("ix_traffic_flows_destination_updated", "destination_ip", "updated_at"),
|
||||
Index("ix_traffic_flows_destination_port_updated", "destination_port", "updated_at"),
|
||||
Index("ix_traffic_flows_state_updated", "state", "updated_at"),
|
||||
)
|
||||
|
||||
id: Mapped[str] = mapped_column(String, primary_key=True, default=new_id)
|
||||
node_id: Mapped[str] = mapped_column(ForeignKey("nodes.id"), index=True)
|
||||
|
||||
Reference in New Issue
Block a user