Passer au contenu principal
Permet d’exécuter des requêtes SELECT et INSERT sur des données stockées sur un serveur MySQL distant.

Syntaxe

mysql({host:port, database, table, user, password[, replace_query, on_duplicate_clause] | named_collection[, option=value [,..]]})

Arguments

ArgumentDescription
host:portAdresse du serveur MySQL.
databaseNom de la base de données distante.
tableNom de la table distante.
userUtilisateur MySQL.
passwordMot de passe de l’utilisateur.
replace_queryIndicateur qui convertit les requêtes INSERT INTO en REPLACE INTO. Valeurs possibles :
- 0 - La requête est exécutée comme INSERT INTO.
- 1 - La requête est exécutée comme REPLACE INTO.
on_duplicate_clauseExpression ON DUPLICATE KEY on_duplicate_clause ajoutée à la requête INSERT. Elle ne peut être spécifiée qu’avec replace_query = 0 (si vous passez simultanément replace_query = 1 et on_duplicate_clause, ClickHouse génère une exception).
Exemple : INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1;
Ici, on_duplicate_clause correspond à UPDATE c2 = c2 + 1. Consultez la documentation MySQL pour savoir quelle valeur de on_duplicate_clause vous pouvez utiliser avec la clause ON DUPLICATE KEY.
Les arguments peuvent également être transmis à l’aide de collections nommées. Dans ce cas, host et port doivent être spécifiés séparément. Cette approche est recommandée en environnement de production. Les clauses WHERE simples telles que =, !=, >, >=, <, <= sont actuellement exécutées sur le serveur MySQL. Le reste des conditions et la contrainte d’échantillonnage LIMIT ne sont exécutés dans ClickHouse qu’une fois la requête MySQL terminée. Prend en charge plusieurs répliques, qui doivent être séparées par |. Par exemple :
SELECT name FROM mysql(`mysql{1|2|3}:3306`, 'mysql_database', 'mysql_table', 'user', 'password');
ou
SELECT name FROM mysql(`mysql1:3306|mysql2:3306|mysql3:3306`, 'mysql_database', 'mysql_table', 'user', 'password');

Valeur retournée

Un objet de table avec les mêmes colonnes que la table MySQL d’origine.
Certains types de données MySQL peuvent correspondre à différents types de ClickHouse ; cela est géré par le paramètre au niveau de la requête mysql_datatypes_support_level
Dans la requête INSERT, pour distinguer la fonction de table mysql(...) d’un nom de table accompagné d’une liste de noms de colonnes, vous devez utiliser les mots-clés FUNCTION ou TABLE FUNCTION. Voir les exemples ci-dessous.

Exemples

Table dans MySQL :
mysql> CREATE TABLE `test`.`test` (
    ->   `int_id` INT NOT NULL AUTO_INCREMENT,
    ->   `float` FLOAT NOT NULL,
    ->   PRIMARY KEY (`int_id`));

mysql> INSERT INTO test (`int_id`, `float`) VALUES (1,2);

mysql> SELECT * FROM test;
+--------+-------+
| int_id | float |
+--------+-------+
|      1 |     2 |
+--------+-------+
Sélection de données dans ClickHouse :
SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123');
Ou avec les collections nommées :
CREATE NAMED COLLECTION creds AS
        host = 'localhost',
        port = 3306,
        database = 'test',
        user = 'bayonet',
        password = '123';
SELECT * FROM mysql(creds, table='test');
┌─int_id─┬─float─┐
│      1 │     2 │
└────────┴───────┘

enable_compression

Active la compression pour les connexions via le protocole MySQL. Valeur par défaut : false. Ce paramètre s’applique à :
  • la fonction de table mysql ;
  • le moteur de table MySQL ;
  • le moteur de base de données MySQL ;
  • les collections nommées utilisées par les intégrations MySQL.
Lorsqu’il est activé, ClickHouse demande la compression pour cette connexion. Exemple :
SELECT *
FROM mysql(
    'mysql80:3306',
    'clickhouse',
    'test_table',
    'root',
    'password',
    SETTINGS enable_compression = 1
);
Remplacement et insertion :
INSERT INTO FUNCTION mysql('localhost:3306', 'test', 'test', 'bayonet', '123', 1) (int_id, float) VALUES (1, 3);
INSERT INTO TABLE FUNCTION mysql('localhost:3306', 'test', 'test', 'bayonet', '123', 0, 'UPDATE int_id = int_id + 1') (int_id, float) VALUES (1, 4);
SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123');
┌─int_id─┬─float─┐
│      1 │     3 │
│      2 │     4 │
└────────┴───────┘
Copie des données d’une table MySQL vers une table ClickHouse :
CREATE TABLE mysql_copy
(
   `id` UInt64,
   `datetime` DateTime('UTC'),
   `description` String,
)
ENGINE = MergeTree
ORDER BY (id,datetime);

INSERT INTO mysql_copy
SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password');
Ou, si vous copiez uniquement un lot incrémentiel depuis MySQL en vous basant sur l’ID maximal actuel :
INSERT INTO mysql_copy
SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password')
WHERE id > (SELECT max(id) FROM mysql_copy);
Dernière modification le 25 juin 2026