Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

محرك الجدول MySQL

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

إنشاء جدول

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = MySQL({host:port, database, table, user, password[, replace_query, on_duplicate_clause] | named_collection[, option=value [,..]]})
SETTINGS
    [ connection_pool_size=16, ]
    [ connection_max_tries=3, ]
    [ connection_wait_timeout=5, ]
    [ connection_auto_close=true, ]
    [ connect_timeout=10, ]
    [ read_write_timeout=300, ]
    [ enable_compression=false ]
;

اطّلع على وصف مفصل لاستعلام CREATE TABLE.

يمكن أن يختلف هيكل الجدول عن هيكل جدول MySQL الأصلي:

  • يجب أن تكون أسماء الأعمدة مطابقةً لما هي عليه في جدول MySQL الأصلي، لكن يمكنك استخدام بعض هذه الأعمدة فقط وبأي ترتيب.
  • قد تختلف أنواع الأعمدة عن تلك الموجودة في جدول MySQL الأصلي. ويحاول ClickHouse cast القيم إلى أنواع بيانات ClickHouse.
  • يحدّد الإعداد external_table_functions_use_nulls كيفية التعامل مع الأعمدة Nullable. القيمة الافتراضية: 1. إذا كانت القيمة 0، فلن تُنشئ دالة الجدول أعمدة Nullable، وستُدرج القيم الافتراضية بدلًا من nulls. وينطبق ذلك أيضًا على قيم NULL داخل المصفوفات.

معلمات المحرك

  • host:port — عنوان خادم MySQL.
  • database — اسم قاعدة البيانات البعيدة.
  • table — اسم الجدول البعيد، أو استعلام يُمرَّر إلى MySQL كما هو (راجع تمرير استعلام بدلًا من اسم جدول).
  • user — مستخدم MySQL.
  • password — كلمة مرور المستخدم.
  • replace_query — علامة تُحوّل استعلامات INSERT INTO إلى REPLACE INTO. إذا كانت replace_query=1، فسيُستبدل الاستعلام.
  • on_duplicate_clause — التعبير ON DUPLICATE KEY on_duplicate_clause الذي يُضاف إلى استعلام INSERT. مثال: 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. لتحديد on_duplicate_clause، يجب تمرير 0 إلى المعلمة replace_query. وإذا مرّرت replace_query = 1 وon_duplicate_clause في الوقت نفسه، فسينشئ ClickHouse استثناءً.

يمكن أيضًا تمرير الوسيطات باستخدام المجموعات المسماة. في هذه الحالة، يجب تحديد host وport كلٌّ على حدة. ويُنصح بهذا النهج في بيئة الإنتاج.

تُنفَّذ عبارات WHERE البسيطة، مثل =, !=, >, >=, <, <=، على خادم MySQL.

أما بقية الشروط وقيد أخذ العينات LIMIT، فلا تُنفَّذ إلا في ClickHouse بعد اكتمال الاستعلام إلى MySQL.

TLS/SSL

تُمرَّر بيانات اعتماد الاتصال المشفّر بـ MySQL كمفاتيح في مجموعة مسمّاة (أو كوسيطات مفتاح-قيمة):

المَعلمة الوصف
ssl_ca_pem محتوى شهادة CA التي يُتحقَّق من شهادة خادم MySQL بمقارنتها بها.
ssl_cert_pem محتوى شهادة العميل، للمصادقة المستندة إلى الشهادات.
ssl_key_pem محتوى المفتاح الخاص المرتبط بـ ssl_cert_pem.

القيم هي محتويات ملفات PEM المقابلة، ويمكن نسخها إلى مجموعة مسمّاة أو إلى استعلام. وتُحجب في السجلات واستعلامات SHOW، بالطريقة نفسها التي تُحجب بها كلمات المرور.

يمكن أيضًا تقديم بيانات الاعتماد نفسها كمسارات لملفات على الخادم، ضمن ssl_ca وssl_cert وssl_key — ولكن فقط في مجموعة مسمّاة معرّفة في ملف تكوين الخادم، ولا يمكن تجاوز هذه القيمة في استعلام. يفتح الخادم هذه الملفات بصلاحياته الخاصة، لذا فإن قبول مسار من SQL سيتيح لأي مستخدم قادر على تعريف مصدر MySQL فحص نظام الملفات المحلي والمصادقة باستخدام شهادة ومفتاح لا يُسمح له بقراءتهما بنفسه.

<named_collections>
    <mysql_creds>
        <host>mysql-host</host>
        <port>3306</port>
        <user>mysql_user</user>
        <password>****</password>
        <ssl_ca>/etc/clickhouse-server/mysql-ca.crt</ssl_ca>
    </mysql_creds>
</named_collections>

تمرير استعلام بدلًا من اسم جدول

بدلًا من اسم الجدول، يمكن أن يكون المعامل table استعلام SELECT يُمرَّر إلى MySQL كما هو. ويُستدل على بنية الجدول من نتيجة الاستعلام. ويمكن كتابة الاستعلام إما كاستعلام فرعي أو بتغليفه داخل الدالة query:

CREATE TABLE mysql_table ENGINE = MySQL('localhost:3306', 'test', (SELECT a, b FROM t1 JOIN t2 USING (id) WHERE a > 0), 'user', 'password');
CREATE TABLE mysql_table ENGINE = MySQL('localhost:3306', 'test', query('SELECT a, b FROM t1 JOIN t2 USING (id) WHERE a > 0'), 'user', 'password');

هذا مفيد لتنفيذ عمليات join وعمليات التجميع أو أي معالجة أخرى على MySQL. وهذا الجدول للقراءة فقط: لا يُسمح بتنفيذ INSERT فيه. كما أن دالة الجدول mysql تدعم الصياغة نفسها.

يدعم عدة نُسخ متماثلة يجب إدراجها باستخدام |. على سبيل المثال:

CREATE TABLE test_replicas (id UInt32, name String, age UInt32, money UInt32) ENGINE = MySQL(`mysql{2|3|4}:3306`, 'clickhouse', 'test_replicas', 'root', 'clickhouse');

مثال للاستخدام

أنشئ جدولًا في MySQL:

mysql> CREATE TABLE `test`.`test` (
    ->   `int_id` INT NOT NULL AUTO_INCREMENT,
    ->   `int_nullable` INT NULL DEFAULT NULL,
    ->   `float` FLOAT NOT NULL,
    ->   `float_nullable` FLOAT NULL DEFAULT NULL,
    ->   PRIMARY KEY (`int_id`));
Query OK, 0 rows affected (0,09 sec)

mysql> insert into test (`int_id`, `float`) VALUES (1,2);
Query OK, 1 row affected (0,00 sec)

mysql> select * from test;
+------+----------+-----+----------+
| int_id | int_nullable | float | float_nullable |
+------+----------+-----+----------+
|      1 |         NULL |     2 |           NULL |
+------+----------+-----+----------+
1 row in set (0,00 sec)

أنشئ جدولًا في ClickHouse باستخدام وسيطات بسيطة:

CREATE TABLE mysql_table
(
    `float_nullable` Nullable(Float32),
    `int_id` Int32
)
ENGINE = MySQL('localhost:3306', 'test', 'test', 'bayonet', '123')

أو باستخدام المجموعات المُسمّاة:

CREATE NAMED COLLECTION creds AS
        host = 'localhost',
        port = 3306,
        database = 'test',
        user = 'bayonet',
        password = '123';
CREATE TABLE mysql_table
(
    `float_nullable` Nullable(Float32),
    `int_id` Int32
)
ENGINE = MySQL(creds, table='test')

استرداد البيانات من جدول MySQL:

SELECT * FROM mysql_table
┌─float_nullable─┬─int_id─┐
│           ᴺᵁᴸᴸ │      1 │
└────────────────┴────────┘

الإعدادات

الإعدادات الافتراضية ليست فعّالة جدًا، إذ إنها لا تعيد استخدام الاتصالات حتى. تتيح لك هذه الإعدادات زيادة عدد الاستعلامات التي ينفّذها الخادوم في الثانية.

connection_auto_close

يسمح بإغلاق الاتصال تلقائيًا بعد تنفيذ الاستعلام، أي بتعطيل إعادة استخدام الاتصال.

القيم الممكنة:

  • 1 — يُسمح بالإغلاق التلقائي للاتصال، وبالتالي يتم تعطيل إعادة استخدام الاتصال
  • 0 — لا يُسمح بالإغلاق التلقائي للاتصال، وبالتالي يكون إعادة استخدام الاتصال مفعّلًا

القيمة الافتراضية: 1.

connection_max_tries

يحدد عدد مرات إعادة المحاولة لمجمع الاتصالات مع التبديل التلقائي عند التعطل.

القيم الممكنة:

  • عدد صحيح موجب.
  • 0 — لا توجد أي محاولات إعادة لمجمع الاتصالات مع التبديل التلقائي عند التعطل.

القيمة الافتراضية: 3.

connection_pool_size

حجم مجمع الاتصالات (إذا كانت جميع الاتصالات قيد الاستخدام، فسوف ينتظر الاستعلام حتى يتحرر أحد الاتصالات).

القيم الممكنة:

  • عدد صحيح موجب.

القيمة الافتراضية: 16.

connection_wait_timeout

مهلة الانتظار (بالثواني) حتى يتوفر اتصال متاح (إذا كان هناك بالفعل connection_pool_size من الاتصالات النشطة)، 0 - لا تنتظر.

القيم الممكنة:

  • عدد صحيح موجب.

القيمة الافتراضية: 5.

connect_timeout

مهلة الاتصال (بالثواني).

القيم الممكنة:

  • عدد صحيح موجب.

القيمة الافتراضية: 10.

read_write_timeout

مهلة القراءة/الكتابة (بالثواني).

القيم الممكنة:

  • عدد صحيح موجب.

القيمة الافتراضية: 300.

enable_compression

يُمكّن الضغط لاتصال بروتوكول MySQL.

القيمة الافتراضية: false.

ينطبق هذا الإعداد على:

  • محرك الجدول MySQL؛
  • محرك قاعدة البيانات MySQL؛
  • دالة الجدول mysql؛
  • المجموعات المسماة المستخدمة في تكاملات MySQL.

عند تمكينه، يطلب ClickHouse استخدام الضغط لهذا الاتصال.

مثال:

CREATE TABLE mysql_engine_compression
(
    id UInt32,
    name String,
    age UInt32,
    money UInt32
)
ENGINE = MySQL('mysql80:3306', 'clickhouse', 'test_table', 'root', 'password')
SETTINGS enable_compression = 1;

انظر أيضًا

Navigation