Optimización en MySql

Bases de datos

Cuando trabajas con cualquier base de datos y empiezas a mover un gran número de registros, se va haciendo primordial optimizar al máximo el rendimiento. En este articulo vamos a tratar la optimización con MySql.

  • Importancia del tipo de tabla: esto merece un artículo completo, pero resumiendo: si la tabla va a ser consultada muchas veces (muchas selects) usa MyIsam, en cambio si va a ser modificada continuamente (inserts y updates) usa InnoDB. También hay que tener en cuenta que en las versiones actuales, InnoDBes la única que puede garantizar la referencia relacional.
  • Indexa y vuelve a revisar tus índices: Es muy importante la correcta indexación de los campos que uses frecuentemente para las búsquedas, los que uses para relacionar con otras tablas, etc... Siempre que haya una bajada de rendimiento en una tabla es lo primero a revisar.
  • Revisa la fragmentación de tablas e índices. En tablas donde existan un importante número de borrados, puede producirse una fragmentación de los datos, y más importante aún, una fragmentación de sus índices con la bajada de rendimiento que ello conlleva.
    • MyIsam => OTIMIZE TABLE
    • Innodb => No existe como tal, se consigue lo mismo haciendo un alterate inofensivo para la tabla: ALTERATE TABLE innodb
  • Activa las SLOW QUERIES y revisa las consultas conflictivas con la función EXPLAIN.
    log-slow-queries=/var/log/ slow-queries.log
    long_query_time = 10
    
  • Crea las variables en consonancia al tipo de información que va a contener: a menudo he visto crear campos text para almacenar cualquier tipo de información. Aunque pueda resultar cómodo a la larga puede dar grandes problemas
  • Otra de las herramientas que te da MySql es “PROCEDURE ANALYSE() “. Con esta sentencia puedes sacar sugerencias sobre la estructura de cualquier tabla. Para ello, usa los datos existentes en los registros, y con ellos te propone cambios como el tipo de campo, su tamaño, etc... por ello es necesario que la tabla este llena, cuantos más datos existan mejor.
    SELECT *
    FROM movimientos
    PROCEDURE ANALYSE();
    
  • Cuando hagas una consulta en la que solo esperas recibir un registro, por ejemplo, cuando filtras por un id único, usa siempre LIMIT 1. Con esto conseguiras que la consulta no siga recorriendo el resto de registros una vez encontrado.
  • Agrupa sentencias, si vas a hacer una inserción masiva de datos por ejemplo, agrupa los values en única consulta:
    INSERT INTO table_name (column1, column2)
    VALUES (value1, value2), (value1, value2), ... ,(value1, value2)
    
  • Nunca uses ORDER BY RAND(). Es muy sencillo para sacar una muestra aleatoria de datos, pero su rendimiento deja mucho que desear, y cuando la tabla empieza a tener gran tamaño la perdida de velocidad se agudiza.
Si quieres leer más articulos como este, sigueme: @ander_gs
Compartir en: