# Optimización en la estructura de datos en un bucket

La optimización de la estructura de datos en InfluxDB es fundamental para garantizar **bajo latencia en consultas** y **almacenamiento eficiente**, especialmente en entornos SCADA donde se manejan miles de puntos de datos por segundo.

## Diseño del esquema de datos

**Principios fundamentales:**

* **Tags vs Fields:**

  * *Tags*: Indexados, ideales para metadatos usados en filtros (ej: `sensor_id`, `planta`)
  * *Fields*: No indexados, perfectos para valores numéricos variables (ej: `temperatura`, `presión`)

  <pre class="language-python" data-title="python" data-overflow="wrap"><code class="lang-python"># Estructura óptima:
  medicion,tag1=valor1,tag2=valor2 campo1=valor,campo2=valor timestamp
  </code></pre>
* **Cardinalidad de series:**\
  Limitar a <100,000 series por bucket. Ejemplo problemático: `sensor,id=UUID4_DINÁMICO valor=...` genera alta cardinalidad.

## Configuración de buckets y retención

**Estrategias para SCADA:**

* **Segmentación por criticidad:**

  <pre data-title="text" data-overflow="wrap"><code>| Bucket           | Retención  | Caso de uso               |
  |------------------|------------|---------------------------|
  | alarmas_scada    | Infinita   | Auditoría de eventos      |
  | datos_tiempo_real| 30 días    | Monitorización continua   |
  | metricas_sistema | 1 año      | Análisis de rendimiento   |
  </code></pre>
* **Políticas de retención:**\
  Usar `ALTER RETENTION POLICY` para ajustar dinámicamente según necesidades operativas.

## Optimización de escrituras

**Técnicas comprobadas:**

* **Batching:** Enviar lotes de **5,000 líneas** de protocolo por request.
* **Ordenamiento de tags:**

  <pre class="language-bash" data-title="bash" data-overflow="wrap"><code class="lang-bash"># Antes:
  medida,tagC=val,tagA=val campo=1
  # Optimizado:
  medida,tagA=val,tagB=val,tagC=val campo=1
  </code></pre>
* **Compresión GZIP:** Reduce ancho de banda hasta 5x:

  <pre class="language-bash" data-title="bash" data-overflow="wrap"><code class="lang-bash">curl --header "Content-Encoding: gzip" --data-binary @datos.gzip...
  </code></pre>

## Gestión de series temporales

**En entornos industriales:**

* **Downsampling automático:** Usar `Continuous Queries` para agregar datos históricos
* **Troubleshooting:** Identificar series problemáticas

### Optimización de consultas

**Problema:** Consulta de temperatura promedio por zona tarda >10s\
**Solución:**

{% code title="text" overflow="wrap" %}

```
from(bucket:"scada")
  |> range(start: -15m)
  |> filter(fn: (r) => r._measurement == "temperatura")
  |> group(columns: ["zona"])
  |> aggregateWindow(every: 1m, fn: mean)
  |> yield(name: "promedio")
```

{% endcode %}

**Mejoras:**

* Tiempo reducido a 1.2s usando índices en `zona`
* Uso de memoria disminuido 40% con `pushdowns`


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://darioaplicano.gitbook.io/influxdb2.x/sesion-1/guion-de-la-sesion/documentacion/conceptos-clave-de-influxdb/optimizacion-en-la-estructura-de-datos-en-un-bucket.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
