MySql: Pruebas de rendimiento y parametrización usando mysqlslap

 

A MySql le acompaña mysqlslap (creo que a partir de 5.x), un ejecutable que permite hacer ejecuciones de scripts masivas para simular carga la carga de trabajo en el servidor generada por clientes mysql. Le podemos pasar un script de preparación y un script de consultas DML sobre el que medir tiempos. Con esto lo interesante también es que podemos obtener el tiempo mínimo, máximo y medio con distintas concurrencias.

  1. Podemos empezar con un ejemplo básico con script de creación y de carga.
    Editamos el fichero create.sql:
    CREATE TABLE sub_name (sub_id INT NOT NULL PRIMARY KEY, name VARCHAR(30)) engine=ndb;
    CREATE TABLE sub_age (sub_id INT NOT NULL PRIMARY KEY, age INT) engine=ndb;
    INSERT INTO sub_name VALUES (1,'Bill'),(2,'Fred'),(3,'Bill'),(4,'Jane'),(5,'Andrew'),(6,'Anne'),
    (7,'Juliette'),(8,'Awen'),(9,'Leo'),(10,'Bill');
    INSERT INTO sub_age VALUES (1,40),(2,23),(3,33),(4,19),(5,21),(6,50),(7,31),(8,65),(9,18),
    (10,101);

    Después editamos el query.sql:
    SELECT sub_age.age FROM sub_name, sub_age where sub_name.sub_id=sub_age.sub_id
    AND sub_name.name='Bill' ORDER BY sub_age.age;

    Finalmente probamos y vemos el resultado:
    shell> mysqlslap --concurrency=5 --iterations=100 --query=query.sql --create=create.sql
    Benchmark
    Average number of seconds to run all queries: 0.132 seconds
    Minimum number of seconds to run all queries: 0.037 seconds
    Maximum number of seconds to run all queries: 0.268 seconds
    Number of clients running queries: 5
    Average number of queries per client: 1

     

  2. Si queremos simular carga con algo más complejo podemos crear una tabla temporal pero indefinida indicándole parámetros como número y tipos de campos, tipo de carga etc... Un ejemplo sería el siguiente:

    shell>mysqlslap  --concurrency=1 --iterations=10 --number-int-cols=6 --number-char-cols=12 --auto-generate-sql --engine=innodb 
        --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=mixed  --number-of-queries=10000  --user=root --password

     

  3. Hasta aquí es sencillo y bastante claro, solo falta pensar otros usos más complejos que se le pueden dar. Si pensamos en algo ambicioso podemos trabajar con las tablas y consultas de producción recogiendo las consultas DML que se ejecutan. Lo podremos usar para probar, mejorar procesos, SELECTs, optimizar INSERTs/UPDATEs, parámetros de la base de datos etc. Bastaría con:
    -Conseguir un Snapshot de la base de datos de producción (estado inicial)
    -Recuperar las querys que nos interesen del mysql.log y meterlas en un script(tratándolas si hace falta).
    -Jugar con mysqlslap!!