---
title: "Acelera WordPress añadiendo un índice a wp_options (guía práctica con SQL y WP-CLI)"
description: "La tabla wp_options suele “engordar” con datos de temas y plugins (opciones, transients, sesiones, etc.). Si tu wp-admin va lento o ves consultas repetidas a wp_options , hay dos palancas claras: Obje..."
url: https://wpdirecto.com/acelera-wordpress-anadiendo-un-indice-a-wp_options-guia-practica-con-sql-y-wp-cli/
date: 2025-11-13
modified: 2025-11-13
author: "Editor WPDirecto"
image: https://wpdirecto.com/wp-content/uploads/2025/05/index-mysql-wordpress.jpg
categories: ["Rendimiento"]
tags: ["índice", "optimización"]
type: post
lang: es
---

# Acelera WordPress añadiendo un índice a wp_options (guía práctica con SQL y WP-CLI)

La tabla `wp_options` suele “engordar” con datos de temas y plugins (opciones, transients, sesiones, etc.). Si tu **wp-admin va lento** o ves consultas repetidas a `wp_options`, hay dos palancas claras:

- **Object cache** (Redis/Memcached): saca lecturas a RAM.
- **Índice en MySQL**: acelera búsquedas dentro de `wp_options`.

Aquí tienes una guía paso a paso para **comprobar**, **decidir** si conviene, **crear** el índice compuesto recomendado y **medir** el impacto. Incluyo equivalentes con **WP-CLI** y **rollback** seguro.

---

## 0) Antes de tocar nada

- **Backup** de base de datos (dump) y, si puedes, snapshot.
- **Ventana de mantenimiento** si tu instancia tiene mucho tráfico.
- **Versión de MySQL/InnoDB**: en MySQL ≥5.7 puedes hacer DDL “online” con menos bloqueo (ver apartado 5).

---

## 1) ¿Ya existe un índice útil en `wp_options`?

WordPress trae por defecto:

- **PRIMARY KEY** en `option_id`
- **UNIQUE KEY** en `option_name`

Lo que **no trae** es un índice por `autoload`, útil para consultas del tipo:

```
SELECT option_name, option_value
FROM wp_options
WHERE autoload = 'yes';
Lenguaje del código: JavaScript (javascript)
```

### Ver índices actuales (SQL)

```
SHOW INDEX FROM wp_options;
```

### Con WP-CLI (respeta tu prefijo dinámicamente)

```
wp db query "SHOW INDEX FROM $(wp db prefix)options;"
Lenguaje del código: JavaScript (javascript)
```

Si ves un índice adicional con `Column_name = autoload` (o un compuesto `autoload, option_name`) **ya lo tienes**. Si no, sigue.

**Atajo para listar solo “no estándar”:**

```
SHOW INDEX FROM wp_options
WHERE column_name NOT IN ('option_id','option_name');
Lenguaje del código: JavaScript (javascript)
```

```
wp db query "SHOW INDEX FROM $(wp db prefix)options WHERE column_name NOT IN ('option_id','option_name');"
Lenguaje del código: JavaScript (javascript)
```

---

## 2) ¿Tiene sentido añadir el índice? (regla práctica)

El índice `autoload, option_name` aporta más **cuando la mayoría de filas NO se autoloadan** (es decir, `autoload='no'` es muy superior a `autoload='yes'`). Como regla de pulgar: si **60–80 %** o más de las filas son `autoload='no'`, el índice suele **merecer la pena**.

### Cuenta filas autoload “sí” y “no”

```
-- autoload = 'yes'
SELECT COUNT(*) AS AutoloadYes
FROM wp_options
WHERE autoload = 'yes';

-- autoload = 'no'
SELECT COUNT(*) AS AutoloadNo
FROM wp_options
WHERE autoload = 'no';
Lenguaje del código: PHP (php)
```

WP-CLI:

```
wp db query "SELECT COUNT(*) AS AutoloadYes FROM $(wp db prefix)options WHERE autoload='yes';"
wp db query "SELECT COUNT(*) AS AutoloadNo  FROM $(wp db prefix)options WHERE autoload='no';"
Lenguaje del código: JavaScript (javascript)
```

> Nota: las búsquedas por `option_name = 'algo'` ya usan el índice único de `option_name`. El índice que añadimos está orientado a cargar autoload y a ciertos barridos por `autoload`.

---

## 3) Crea el índice compuesto recomendado

**Opción rápida (CREATE INDEX):**

```
CREATE INDEX autoloadindex
ON wp_options (autoload, option_name);
```

WP-CLI:

```
wp db query "CREATE INDEX autoloadindex ON $(wp db prefix)options (autoload, option_name);"
Lenguaje del código: JavaScript (javascript)
```

**Opción con DDL “online” (menos bloqueo) usando `ALTER TABLE`:**
(soportado en InnoDB MySQL ≥ 5.7 / 8.0; MariaDB tiene matices)

```
ALTER TABLE wp_options
  ADD INDEX autoloadindex (autoload, option_name),
  ALGORITHM=INPLACE, LOCK=NONE;
```

WP-CLI:

```
wp db query "ALTER TABLE $(wp db prefix)options ADD INDEX autoloadindex (autoload, option_name), ALGORITHM=INPLACE, LOCK=NONE;"
Lenguaje del código: JavaScript (javascript)
```

> Por qué compuesto: consultas por `autoload='yes'` obtienen búsqueda selectiva, y si además el motor necesita ordenar/filtrar por `option_name`, el compuesto ayuda a evitar filesorts.

---

## 4) Verifica que se usa el índice (EXPLAIN)

Comprueba el plan de ejecución **antes y después** del cambio:

```
EXPLAIN SELECT option_name, option_value
FROM wp_options
WHERE autoload='yes';
Lenguaje del código: JavaScript (javascript)
```

En MySQL 8.0 puedes usar:

```
EXPLAIN ANALYZE SELECT ...;
```

Deberías ver `key: autoloadindex` y `type: ref` (o similar), con menos filas examinadas.

---

## 5) Consideraciones de bloqueo / tiempo de creación

- **Tablas grandes**: crear un índice puede ser costoso. Usa la variante `ALTER TABLE ... ALGORITHM=INPLACE, LOCK=NONE` para minimizar bloqueos (si tu versión lo soporta).
- **Espacio**: un índice adicional consume **almacenamiento** (normalmente asumible).
- **Warm-up**: tras crear el índice, los primeros accesos pueden calentar el buffer pool.

---

## 6) Mide la mejora

- **New Relic / APM**: mira la **transacción lenta** que consultaba `wp_options`.
- **Slow Query Log**: compara tiempos y “rows examined”.
- **Query Monitor (plugin)**: vigila consultas en admin y front.

Si tu cuello de botella era `wp_options`, deberías notar:

- Menos tiempo en **cargar autoloads**.
- **wp-admin** más ágil, sobre todo en sitios con muchos transients/opciones.

---

## 7) ¿Quieres revertir? (DROP INDEX)

```
DROP INDEX autoloadindex ON wp_options;
```

WP-CLI:

```
wp db query "DROP INDEX autoloadindex ON $(wp db prefix)options;"
Lenguaje del código: JavaScript (javascript)
```

---

## 8) Complementa con **Object Cache** (Redis/Memcached)

El índice acelera el acceso en disco, pero si puedes, añade **object cache persistente**:

- WordPress consultará valores **desde RAM** (Redis/Memcached) y aliviará aún más tu BD.
- En sitios de mucho tráfico o WooCommerce, **índice + object cache** es el combo ideal.

---

## 9) Checklist rápido (para producción)

- Backup DB y ventana de mantenimiento.
- Contar `autoload yes/no` y decidir.
- Crear índice **online** (ALTER … LOCK=NONE) si es posible.
- Verificar con **EXPLAIN** que el índice se usa.
- Medir antes/después (APM/slow log).
- Valorar **Redis/Memcached** como siguiente paso.

---

## Snippets listos para pegar

**Comprobar índices “no estándar”:**

```
wp db query "SHOW INDEX FROM $(wp db prefix)options WHERE column_name NOT IN ('option_id','option_name');"
Lenguaje del código: JavaScript (javascript)
```

**Contar autoload sí/no:**

```
wp db query "SELECT COUNT(*) AS AutoloadYes FROM $(wp db prefix)options WHERE autoload='yes';"
wp db query "SELECT COUNT(*) AS AutoloadNo  FROM $(wp db prefix)options WHERE autoload='no';"
Lenguaje del código: JavaScript (javascript)
```

**Crear índice compuesto (rápido):**

```
wp db query "CREATE INDEX autoloadindex ON $(wp db prefix)options (autoload, option_name);"
Lenguaje del código: JavaScript (javascript)
```

**Crear índice con menos bloqueo (si compatible):**

```
wp db query "ALTER TABLE $(wp db prefix)options ADD INDEX autoloadindex (autoload, option_name), ALGORITHM=INPLACE, LOCK=NONE;"
Lenguaje del código: JavaScript (javascript)
```

**Ver plan (EXPLAIN):**

```
wp db query "EXPLAIN SELECT option_name, option_value FROM $(wp db prefix)options WHERE autoload='yes';"
Lenguaje del código: JavaScript (javascript)
```

**Eliminar índice (rollback):**

```
wp db query "DROP INDEX autoloadindex ON $(wp db prefix)options;"
Lenguaje del código: JavaScript (javascript)
```

---

### Notas finales

- El **índice único de `option_name`** ya cubre consultas por una opción concreta; el índice compuesto **no lo sustituye**, lo **complementa** para cargas por `autoload`.
- No indexes `option_value` (suele ser `LONGTEXT`): no aporta en estos escenarios y encarece la tabla.
- Si tu hosting ofrece **MariaDB**, el comportamiento de DDL online puede variar: revisa su manual para `LOCK=NONE`.

Con esto tendrás un camino sólido para **acelerar `wp_options`** y, por extensión, **agilizar el dashboard** y ciertas cargas del front.
