Blog

Programación, desarrollo web y SEO

Mejorar la velocidad en Opencart

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
pruebas velocidad

Desde Google

velocidad google

 

Desde Gtmetrix
velocidad opencart

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 velocidad opencart

Mejorar la velocidad Opencart | Google

 

mejorar velocidad

Mejorar la velocidad Opencart | Gtmetrix

 

mejorar opencart tiempo de respuesta

 

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

Share this post

11 comments

Join the conversation
  • Mario - 18 febrero, 2014 reply

    Hola Estimado, muy agradecido con los detalles mencionados, tengo poco conocimiento sobre base de datos, y antes ya había leído eso como un principal problema, me interesa ponerlo en práctica, pero deseo saber mas detalles sobre en que parte específicamente se hacen esas modificaciones, si es en la base de datos misma usando MySQL o si es en algún archivo del servidor FTP. Te agradecería enormemente me indiques esto ultimo, compartiré mi experiencia. Saludos.

    Ber - 18 febrero, 2014 reply

    Hola Mario,
    Tienes que lanzar todas las querys en la base de datos.
    Es muy sencillito, y si tienes muchos productos notarás un poco el incremento de velocidad.
    Si tienes dudas, estoy por aquí.
    Ya nos cuentas que tal.

  • Mario - 19 febrero, 2014 reply

    Hola Ber, Realmente mejoro, gracias al apoyo de un amigo que tiene manejos de sistemas es realmente sencillo, solo en mi caso ingresar al Mysqladmin…. Y en la opcion SQL copiar el codigo que mencionas, pero anteponer algo de acuerdo a la estructura de cada tienda, por ejemplo para el el primer idice sería: CREATE INDEX i_parent_id ON tech_category (parent_id);

    tech_category es lo que diferencia a mi tienda, supongo que otros sitios debe ser XXXXX_category de acuerdo a como lo crearon los usuarios el prefix….. darle continuar y listo… Notablemente es cierto que pingdom es donde mas se nota este aspecto de 8 segundos he bajado a menos de 4 en promedio para mi base de datos que tiene mas de 150 tablas, 55000 filas y solo he creado los indices que indicas

    Ber - 19 febrero, 2014 reply

    Exacto,
    Tienes que poner como prefijo, el prefijo que pusiste al crear la tienda, (no es obligatorio poner un prefijo al poner la tienda , pero en el caso de que lo hayas puesto entonces si lo tienes que poner)

    Por lo general es el nombre de la tienda, u oc_ oc (opencart) o algo similar a esto.

    Y bueno, lo importante es que se nota la velocidad, sobre todo en tiendas de muchos productos.

    Ber - 19 febrero, 2014 reply

    Además yo añadiría comprensión en Gzip, y deshabilitar la cuenta de los productos en las categorias, así como alguna extensión para habilitar la caché.

    Saludos :)

  • Xavi - 9 marzo, 2014 reply

    Hola me estoy volviendo loco porque no soy capaz de introducir los indices que nos has dejado hay.
    Intento y intento pero no simpre me dice que la tabla no existe.
    Yo lo que hago es le doy para hacer una consulta y pego el codigo que tu pusistes pero no funciona
    Podrias explicarlo para gente novata con la base de datos porfavor gracias por adelantado.

  • Xavi - 9 marzo, 2014 reply

    gracias pero al final ya lo consegui jejejeje

  • Ber - 9 marzo, 2014 reply

    Hola Xavi,

    Tienes que poner como prefijo, el prefijo que pusiste al crear la tienda, (no es obligatorio poner un prefijo al poner la tienda , pero en el caso de que lo hayas puesto entonces si lo tienes que poner) ,

    Lo voy a escribir en el artículo para que no os despistéis :)

    Un saludo

  • jesus - 30 abril, 2014 reply

    Hola, desde ahora, AMIGO…

    Llevaba tiempo buscando la forma de mejorar el rendimiento del opencart y por fin, algo que funciona.

    Muchas gracias de verdad y un cordial saludo.

    Ber - 30 abril, 2014 reply

    Gracias, la verdad que Opencart necesita optimización para que corra en condiciones.
    Saludos,

  • Ber - 6 mayo, 2014 reply

    Añadido:
    Descárgalo gratis a cambio de un tweet

Join the conversation


+ 4 = trece