Mejorar la velocidad en Opencart con índices en las tablas
Estas son las pruebas que he realizado con una web desarrollada bajo Opencart,
la idea surge de este hilo del foro oficial de Opencart
En este hilo un desarrollador recomienda crear índices en las tablas para mejorar la velocidad de respuesta del servidor. Es justo lo que vamos a hacer y mediremos los tiempos de respuesta.
La web en la que vamos a hacer las pruebas es una tienda (sex shop) con más de 8000 productos , al tener tantos productos los tiempos de respuesta del servidor eran realmente lentos. Ya sabemos la importancia de tener una web rápida, entre otras cosas mejoraremos la experiencia del usuario y mejoraremos nuestra relación para salir en los resultados de Google (SEO).
Estos son los tiempos de carga de la web antes de realizar los indices en las tablas.
Desde pingdom

Desde Google

Desde Gtmetrix

Después creamos los siguientes índices en las tablas:
Creamos un indice en la Tabla category campo parent_id
Creamos un indice en la Tabla category_description campo language_id.
Creamos un indice en la Tabla category_path campos path_id y level.
Creamos un indice en la Tabla category_to_store campo store_id.
Creamos un indice en la Tabla manufacturer_to_store campo store_id.
Creamos un indice en la Tabla product campos manufacturer_id, date_added, date_modified.
Creamos un indice en la Tabla product campos model, sku, upc, ean y con tipo FULLTEXT (si el campo es de carácteres no de números).
Creamos un indice en la Tabla product_description campo language_id.
Creamos un indice en la Tabla product_to_category campo category_id.
Creamos un indice en la Tabla product_to_store campo store_id.
Creamos un indice en la Tabla setting campo store_id, serialized.
Creamos un indice en la Tabla url_alias campo query con tipo FULLTEXT.
Creamos un indice en la Tabla zone campo country_id.
Creamos un indice en la Tabla zone campo name y code con tipo FULLTEXT.
Este es el código para crear los indices:
Tenéis que poner como prefijo en las tablas, el prefijo que pusiste al crear la tienda, (no es obligatorio poner un prefijo al crear la tienda , pero en el caso de que lo hayas puesto entonces si lo tienes que poner).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| #Tabla category campo parent_id
CREATE INDEX i_parent_id ON category (parent_id);
#Tabla category_description campo language_id
CREATE INDEX i_category_description ON category_description (language_id);
#Tabla category_path campos path_id y level
CREATE INDEX i_category_path ON category_path (path_id,level);
#Tabla category_to_store campo store_id
CREATE INDEX i_category_to_store ON category_to_store (store_id);
#Tabla manufacturer_to_store campo store_id
CREATE INDEX i_manufacturer_to_store ON manufacturer_to_store (store_id);
#Tabla product campos manufacturer_id, date_added, date_modified
CREATE INDEX i_product ON product (manufacturer_id, date_added, date_modified);
#Tabla product campos model, sku, upc, ean,(como veis donde tengais la referencia etc) y con tipo FULLTEXT (si el campo es de caracteres no de números)
CREATE FULLTEXT INDEX i_product_fulltext ON product (model, sku, upc, ean);
#Tabla product_description campo language_id
CREATE INDEX i_product_description ON product_description (language_id);
#Tabla product_to_category campo category_id
CREATE INDEX i_product_to_category ON product_to_category (category_id);
#Tabla product_to_store campo store_id
CREATE INDEX i_product_to_store ON product_to_store (store_id);
#Tabla setting campo store_id, serialized
CREATE INDEX i_setting ON setting (store_id, serialized);
#Tabla url_alias campo query con tipo FULLTEXT
CREATE FULLTEXT INDEX i_url_alias ON url_alias (query);# 6936 filas afectadas.
#Tabla zone campo country_id
CREATE INDEX i_zone ON zone (country_id);
#Tabla zone campo name y code con tipo FULLTEXT
CREATE FULLTEXT INDEX i_zone_fulltext ON zone (name,code); |
Este es el código para dejarlo todo como estaba antes de realizar los indices.
Por si quieres volver a tener la base de datos de tu instalación Opencart exactamente igual que antes de realizar los cambios.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| DROP INDEX i_parent_id ON category;
DROP INDEX i_category_description ON category_description;
DROP INDEX i_category_path ON category_path;
DROP INDEX i_category_to_store ON category_to_store;
DROP INDEX i_manufacturer_to_store ON manufacturer_to_store;
DROP INDEX i_product ON product;
DROP INDEX i_product_fulltext ON product;
DROP INDEX i_product_description ON product_description;
DROP INDEX i_product_to_category ON product_to_category ;
DROP INDEX i_product_to_store ON product_to_store;
DROP INDEX i_setting ON setting;
DROP INDEX i_url_alias ON url_alias;
DROP INDEX i_zone ON zone;
DROP INDEX i_zone_fulltext ON zone; |
Después de realizar los índices comprobamos que se ha mejorado la velocidad de respuesta del servidor, estas son las imagenes de los medidores de velocidad después de realizar los cambios en la base de datos.
Mejorar la velocidad Opencart | Pingdom

Mejorar la velocidad Opencart | Google

Mejorar la velocidad Opencart | Gtmetrix

De momento pingdom es el que ha registrado una velocidad mucho más rápida después de realizar los cambios en la base de datos.
Descargar la extensión gratuita para Opencart
Ahora bien, cómo veo que es un caso muy común y que hay mucha gente que quiere lanzar el código en su base de datos y no sabe como hacerlo, he hecho un fichero xml, para que lo subas a tu servidor y teniendo instalado vQmod se ejecute y cree los índices en las tablas.
Solo tienes que descargarlo y subirlo el fichero indice.xml a tu servidor a la carpeta vQmod/xml/
¿Cómo se si he creado los indices?
Sencillo, te vas a tu página principal (vale cualquier página en la que se muestre el footer) y abajo del todo en la últimas lineas te pondrá que la instalación de los indices ha sido correcta.
Después de ver que la instalación ha sido correcta puedes (y debes) borrar el fichero que acabas de subir.
Y listo, ya tendrás tus tablas con sus índices creados, ahora podrás ver que las consultas a tu base de datos es bastante más rápida que antes.
Descárgalo gratis a cambio de un tweet aquí.
Descargar Mejorar velocidad en Opencart
Leer más
3 comments
Join the conversationjavier - 13 marzo, 2014
Hola buenas. Me pasa ese mismo problema, el botón añadir producto no va, no hace nada.
He revisado todo lo que has comentado y está todo bien.
No se que puede ser.
En mi web me dan estos dos errores….no se si estarán relacionados
Notice: Undefined variable: error in /home/virtual/thehousephone.com/catalog/view/theme/bt_digiworld/template/common/header.tpl on line 216
Notice: Undefined variable: profiles in /home/virtual/thehousephone.com/catalog/view/theme/bt_digiworld/template/product/product.tpl on line 64
Ber - 13 marzo, 2014
Hola Javier,
El error que tienes en referencia al profile, el segundo error, suele producirse porque tienes un Theme de una versión que no es compatible con tu versión de Opencart, revisa la compatibilidad de ambos porque tienes una versión superior de Opencart a la versión de tu theme
Si lo debugas te mostrará que no encuentra este procedimiento. getProfiles()
Ber - 13 marzo, 2014
Si es así, que ya he visto varios así, tienes que hacer un downgrade de versión o subir el theme más actual, en el que caso de que exista tu theme para la versión actual de Opencart.