SELECT وINSERT على البيانات المخزّنة على خادم 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 كمفاتيح في مجموعة مسمّاة (أو كوسيطات مفتاح-قيمة):
القيم هي محتويات ملفات PEM المقابلة، ويمكن نسخها إلى مجموعة مسمّاة أو إلى استعلام. وتُحجب في السجلات واستعلامات
SHOW، بالطريقة نفسها التي تُحجب بها كلمات المرور.
يمكن أيضًا تقديم بيانات الاعتماد نفسها كمسارات لملفات على الخادم، ضمن ssl_ca وssl_cert وssl_key — ولكن فقط في مجموعة مسمّاة معرّفة في ملف تكوين الخادم، ولا يمكن تجاوز هذه القيمة في استعلام. يفتح الخادم هذه الملفات بصلاحياته الخاصة، لذا فإن قبول مسار من SQL سيتيح لأي مستخدم قادر على تعريف مصدر MySQL فحص نظام الملفات المحلي والمصادقة باستخدام شهادة ومفتاح لا يُسمح له بقراءتهما بنفسه.
تمرير استعلام بدلًا من اسم جدول
بدلًا من اسم الجدول، يمكن أن تكون وسيطةtable استعلام SELECT يُمرَّر إلى MySQL كما هو. ويُستدل على هيكل الجدول من نتيجة الاستعلام. ويمكن كتابة الاستعلام إما كاستعلام فرعي أو بتغليفه داخل الدالة query:
join وعمليات التجميع أو أي معالجة أخرى على MySQL. وهذا الجدول للقراءة فقط: لا يُسمح بتنفيذ INSERT فيه. كما أن دالة الجدول mysql تدعم الصياغة نفسها.
يُحلَّل شكل الاستعلام الفرعي
(SELECT ...) بواسطة ClickHouse ويُعاد تسلسله وفق لهجة MySQL (باستخدام علامات الاقتباس الخلفية للمعرّفات) قبل إرساله إلى الخادم. لذلك يجب أن يكون استعلام ClickHouse SQL صالحًا. ولتمرير صياغة خاصة بـ MySQL لا يحلّلها ClickHouse، استخدم صيغة query('...')، إذ يُرسَل نصها إلى MySQL كما هو.أي WHERE أو LIMIT خارجي، أو تجميع، وما إلى ذلك، في استعلام ClickHouse المحيط لا يُدفَع إلى داخل الاستعلام الممرَّر، بل يُطبَّق في ClickHouse بعد جلب نتيجة الاستعلام كاملةً. ولتقييد البيانات المقروءة من MySQL، ضع عامل التصفية داخل الاستعلام الممرَّر. عند استخدام external_table_strict_query = 1، يُرفَض عامل تصفية خارجي على أعمدة الجدول مع استثناء بدلًا من تطبيقه محليًا، لأنه لا يمكن دفعه إلى الاستعلام الممرَّر. يشمل التحقق مسند WHERE ذي المستوى الأعلى وكل رابط في AND ذي المستوى الأعلى. لا تُعد PREWHERE على أعمدة هذا الجدول حالةً لهذا الإعداد: إذ لا يدعم محرك الجدول هذا PREWHERE، ويُرفَض هذا الاستعلام باستخدام ILLEGAL_PREWHERE بغض النظر عن الإعداد. لا يُنفَّذ التحقق إلا حيث يمكن دفع عامل تصفية أصلًا: عندما يكون هذا الجدول هو الجدول الوحيد في الاستعلام، أو على أي من جانبي INNER JOIN، أو على الجانب المُحتفَظ به من الربط الخارجي (الجانب الأيسر من LEFT JOIN، والجانب الأيمن من RIGHT JOIN). على الجانب غير المُحتفَظ به من LEFT/RIGHT JOIN وعلى أي من جانبي FULL JOIN، لا يُدفَع أي شيء ولا يُتحقَّق من أي شيء، لذلك يُطبَّق عامل تصفية على أعمدة هذا الجدول محليًا بعد الربط حتى في الوضع الصارم. حيثما يُنفَّذ التحقق، لا يُدفَع المسند الذي يشير إلى جداول أخرى مربوطة في الاستعلام المحيط ويُستثنى من التحقق، سواء أشار إلى الجانب المربوط فقط أو مزجه مع هذا الجدول ضمن تعبير واحد غير AND (مثل OR)؛ ويحتفظ هذا المسند بنقطة تقييمه المعتادة في ClickHouse (WHERE بعد الربط، وPREWHERE قبله) ولا يُرفَض.|. على سبيل المثال:
مثال للاستخدام
أنشئ جدولًا في MySQL:الإعدادات
الإعدادات الافتراضية ليست فعّالة جدًا، إذ إنها لا تعيد استخدام الاتصالات حتى. تتيح لك هذه الإعدادات زيادة عدد الاستعلامات التي ينفّذها الخادوم في الثانية.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.