Utilisation du plugin de réécriture de requêtes MySQL

Ce plugin permet de modifier les requêtes SQL avant leur exécution dans MySQL. Il offre une fonctionnalité similaire à la réécriture de requêtes pour les vues matérialisées dans Oracle, mais avec une approche distincte.

Ce guide suppose l'utilisation de Percona Server version 5.7.19 ou similaire.

Installation

  1. Localisez le script d'installation : Le fichier install_rewriter.sql se trouve généralement dans le répertoire share sous le répertoire principal de votre installation MySQL.

  2. Exécutez le script d'installation :

    mysql> SOURCE /chemin/vers/mysql/share/install_rewriter.sql;
    

    Des messages de succès indiqueront que les objets nécessaires au plugin ont été créés.

  3. Vérifiez si le plugin est activé :

    mysql> SHOW GLOBAL VARIABLES LIKE 'rewriter_enabled';
    +------------------+-------+
    | Variable_name    | Value |
    +------------------+-------+
    | rewriter_enabled | ON    |
    +------------------+-------+
    
  4. Configuration permanente : Ajoutez la ligne suivante à votre fichier de configuration MySQL (my.cnf ou similaire) sous la section [mysqld] :

    [mysqld]
    rewriter_enabled=ON
    
  5. Activation/Désactivation dynamique : Vous pouvez activer ou désactiver le plugin à la volée en utilisant les commandes suivnates :

    SET GLOBAL rewriter_enabled = ON;
    SET GLOBAL rewriter_enabled = OFF;
    

Tests et Configuration des Règles

  1. Ajout d'une règle de réécriture : Pour modifier toutes les requêtes commençant par SELECT en ajoutant + 1 à la valeur sélectionnée, utilisez :

    mysql> INSERT INTO query_rewrite.rewrite_rules (pattern, replacement) VALUES('SELECT ?', 'SELECT ? + 1');
    
  2. Vérification de l'état des règles :

    mysql> SELECT * FROM query_rewrite.rewrite_rules\G
    *************************** 1. row ***************************
                   id: 1
              pattern: SELECT ?
     pattern_database: NULL
          replacement: SELECT ? + 1
              enabled: YES
              message: NULL
       pattern_digest: NULL
    normalized_pattern: NULL
    
  3. Chargement des règles en mémoire : Pour que le plugin prenne en compte les nouvelles règles, exécutez la procédure suivante :

    mysql> CALL query_rewrite.flush_rewrite_rules();
    
  4. Vérification après le chargement des règles : Les colonnes pattern_digest et normalized_pattern sont remplies, aidant au débogage :

    mysql> SELECT * FROM query_rewrite.rewrite_rules\G
    *************************** 1. row ***************************
                   id: 1
              pattern: SELECT ?
     pattern_database: NULL
          replacement: SELECT ? + 1
              enabled: YES
              message: NULL
       pattern_digest: 512e888765927f4393e9f938df43b1ec
    normalized_pattern: select ?
    
  5. Test de la règle :

    mysql> SELECT 10;
    +--------+
    | 10 + 1 |
    +--------+
    |     11 |
    +--------+
    1 row in set, 1 warning (0.00 sec)
    
    mysql> SHOW WARNINGS\G
    *************************** 1. row ***************************
     Level: Note
      Code: 1105
    Message: Query 'SELECT 10' rewritten to 'SELECT 10 + 1' by a query rewrite plugin
    1 row in set (0.00 sec)
    

    Notez que la requête SELECT PI() n'est pas affectée car elle ne correspond pas au pattern SELECT ?.

  6. Désactivation d'une règle : Modifiez l'état de la règle dans la table rewrite_rules et rechargez les règles :

    mysql> UPDATE query_rewrite.rewrite_rules SET enabled = 'NO' WHERE id = 1;
    mysql> CALL query_rewrite.flush_rewrite_rules();
    
    mysql> SELECT * FROM query_rewrite.rewrite_rules\G
    *************************** 1. row ***************************
                   id: 1
              pattern: SELECT ?
     pattern_database: NULL
          replacement: SELECT ? + 1
              enabled: NO
              message: NULL
       pattern_digest: 512e888765927f4393e9f938df43b1ec
    normalized_pattern: select ?
    

    La requête SELECT 11 ne sera plus réécrite.

  7. Réactivation d'une règle :

    mysql> UPDATE query_rewrite.rewrite_rules SET enabled = 'YES' WHERE id = 1;
    mysql> CALL query_rewrite.flush_rewrite_rules();
    

Logique de Correspondance des Règles

Le plugin utilise une combinaison de méthodes pour faire correspondre une requête SQL à une règle :

  1. Correspondance par hachage : Un hachage est calculé pour la requête SQL entrante et comparé aux hachages des règles enregistrées. Cette méthode est rapide mais peut présenter des risques d'erreurs de correspondance (collisions).
  2. Correspondance par motif normalisé : Si plusieurs règles correspondent via le hachage, le plugin utilise le normalized_pattern pour une comparaison plus précise. Le normalized_pattern est une version canonique du motif de règle.
  3. Correspondance des paramètres : Lors de l'utilisation de paramètres (représentés par ?), le plugin s'assure que le nombre et la position des paramètres dans la requête correspondent à ceux du motif normalisé.

Le tableau suivant illustre la correspondance avec les paramètres :

Instruction préparée Correspondance du motif
PREPARE s AS 'SELECT 3, 3' Oui
PREPARE s AS 'SELECT ?, 3' Oui
PREPARE s AS 'SELECT 3, ?' Non
PREPARE s AS 'SELECT ?, ?' Non

Ce plugin peut être une solution temporaire utile pour corriger des problèmes de performance ou des comportements inattendus dans des environnements de production critiques, en attendant une solution plus durable.

Étiquettes: MySQL query rewrite plugin SQL Optimization percona server

Publié le 13 septembre à 15h34