الانتقال إلى المحتوى الرئيسي
يتيح تنفيذ استعلامات SELECT وINSERT على البيانات المخزّنة على خادم MySQL بعيد.

البنية

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

الوسيطات

ArgumentDescription
host:portعنوان خادم MySQL.
databaseاسم قاعدة البيانات البعيدة.
tableاسم الجدول البعيد.
userمستخدم MySQL.
passwordكلمة مرور المستخدم.
replace_queryعلامة تُحوِّل استعلامات INSERT INTO إلى REPLACE INTO. القيم الممكنة:
- 0 - يُنفَّذ الاستعلام على هيئة INSERT INTO.
- 1 - يُنفَّذ الاستعلام على هيئة REPLACE INTO.
on_duplicate_clauseالتعبير ON DUPLICATE KEY on_duplicate_clause الذي يُضاف إلى استعلام INSERT. لا يمكن تحديده إلا مع replace_query = 0 (إذا مرّرت replace_query = 1 وon_duplicate_clause في الوقت نفسه، فسينتج ClickHouse استثناءً).
مثال: INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1;
تكون on_duplicate_clause هنا هي UPDATE c2 = c2 + 1. راجع وثائق MySQL لمعرفة قيمة on_duplicate_clause التي يمكنك استخدامها مع عبارة ON DUPLICATE KEY.
يمكن أيضًا تمرير الوسيطات باستخدام المجموعات المسماة. في هذه الحالة، يجب تحديد host وport كلٌّ على حدة. يُوصى بهذا الأسلوب في بيئة الإنتاج. تُنفَّذ عبارات WHERE البسيطة مثل =, !=, >, >=, <, <= حاليًا على خادم MySQL. أما بقية الشروط وقيد LIMIT لأخذ العينات، فتُنفَّذ في ClickHouse فقط بعد انتهاء الاستعلام إلى MySQL. يدعم عدة نسخ متماثلة يجب إدراجها باستخدام |. على سبيل المثال:
SELECT name FROM mysql(`mysql{1|2|3}:3306`, 'mysql_database', 'mysql_table', 'user', 'password');
أو
SELECT name FROM mysql(`mysql1:3306|mysql2:3306|mysql3:3306`, 'mysql_database', 'mysql_table', 'user', 'password');

القيمة المُعادة

كائن جدول له الأعمدة نفسها الموجودة في جدول MySQL الأصلي.
يمكن ربط بعض أنواع بيانات MySQL بأنواع مختلفة في ClickHouse، ويُتحكَّم في ذلك عبر الإعداد على مستوى الاستعلام mysql_datatypes_support_level
في استعلام INSERT، وللتمييز بين دالة الجدول mysql(...) واسم جدول يتبعه قائمة بأسماء الأعمدة، يجب استخدام الكلمتين المفتاحيتين FUNCTION أو TABLE FUNCTION. راجع الأمثلة أدناه.

أمثلة

جدول في 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 |
+--------+-------+
استخراج البيانات من ClickHouse:
SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123');
أو باستخدام المجموعات المُسمّاة:
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

يُفعّل الضغط لاتصال بروتوكول MySQL. القيمة الافتراضية: false. ينطبق هذا الإعداد على:
  • دالة الجدول mysql;
  • محرك الجدول MySQL;
  • محرك قاعدة البيانات MySQL;
  • المجموعات المسماة المستخدمة في تكاملات MySQL.
عند تفعيل هذا الإعداد، يطلب ClickHouse ضغط الاتصال. مثال:
SELECT *
FROM mysql(
    'mysql80:3306',
    'clickhouse',
    'test_table',
    'root',
    'password',
    SETTINGS enable_compression = 1
);
الاستبدال والإدراج:
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 │
└────────┴───────┘
نسخ البيانات من جدول في MySQL إلى جدول في 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');
أو عند نسخ دفعة تدريجية فقط من MySQL استنادًا إلى أكبر قيمة id حالية:
INSERT INTO mysql_copy
SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password')
WHERE id > (SELECT max(id) FROM mysql_copy);
آخر تعديل في ٢٩ يونيو ٢٠٢٦