ينتمي هذا المحّرك إلى عائلة محرّكات Log. اطّلع على الخصائص المشتركة لمحرّكات Log والفروق بينها في مقال عائلة محركات Log.
يختلف Log عن TinyLog في وجود ملف صغير من "العلامات" إلى جانب ملفات الأعمدة. وتُكتب هذه العلامات مع كل كتلة بيانات، وتحتوي على إزاحات تشير إلى موضع بدء قراءة الملف لتخطي العدد المحدد من الصفوف. وهذا يتيح قراءة بيانات الجدول باستخدام عدة خيوط تنفيذ.
وعند الوصول المتزامن إلى البيانات، يمكن تنفيذ عمليات القراءة في الوقت نفسه، بينما تحجب عمليات الكتابة عمليات القراءة وتحجب بعضها بعضًا.
لا يدعم المحرّك Log الفهارس. كذلك، إذا فشلت الكتابة إلى جدول، يصبح الجدول تالفًا، وتؤدي القراءة منه إلى إرجاع خطأ. ويُعد المحرّك Log مناسبًا للبيانات المؤقتة، والجداول التي تُكتب مرة واحدة، وأغراض الاختبار أو العرض التوضيحي.
إنشاء جدول
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
column1_name [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
column2_name [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = Logراجع الوصف التفصيلي لاستعلام CREATE TABLE.
كتابة البيانات
يخزّن محرك Log البيانات بكفاءة عبر كتابة كل عمود في ملفه الخاص. ولكل جدول، يكتب محرك Log الملفات التالية إلى مسار التخزين المحدد:
<column>.bin: ملف بيانات لكل عمود، ويحتوي على البيانات المُسلسلة والمضغوطة.__marks.mrk: ملف علامات يخزّن الإزاحات وأعداد الصفوف لكل كتلة بيانات مُدرجة. وتُستخدم هذه العلامات لتسهيل تنفيذ الاستعلامات بكفاءة، إذ تُمكّن المحرك من تخطي كتل البيانات غير ذات الصلة أثناء القراءة.
عملية الكتابة
عند كتابة البيانات إلى جدول Log:
- تُسلسَل البيانات وتُضغط على شكل كتل.
- لكل عمود، تُلحَق البيانات المضغوطة بملف
<column>.binالمقابل له. - تُضاف الإدخالات المقابلة إلى ملف
__marks.mrkلتسجيل الإزاحة وعدد صفوف البيانات المُضافة حديثًا.
قراءة البيانات
يتيح ملف العلامات لـ ClickHouse قراءة البيانات على التوازي. وهذا يعني أن استعلام SELECT يعيد الصفوف بترتيب غير متوقع. استخدم الجملة ORDER BY لفرز الصفوف.
مثال للاستخدام
إنشاء جدول:
CREATE TABLE log_table
(
timestamp DateTime,
message_type String,
message String
)
ENGINE = Logإدراج البيانات:
INSERT INTO log_table VALUES (now(),'REGULAR','The first regular message')
INSERT INTO log_table VALUES (now(),'REGULAR','The second regular message'),(now(),'WARNING','The first warning message')استخدمنا استعلامَي INSERT لإنشاء كتلتَي بيانات داخل ملفات <column>.bin.
يستخدم ClickHouse عدة خيوط تنفيذ عند تنفيذ عمليات SELECT على البيانات. يقرأ كل خيط تنفيذ كتلة بيانات منفصلة ويُرجع الصفوف الناتجة بشكل مستقل فور انتهائه. لذلك، قد لا يتطابق ترتيب كتل الصفوف في الناتج مع ترتيب الكتل نفسها في الإدخال. على سبيل المثال:
SELECT * FROM log_table┌───────────timestamp─┬─message_type─┬─message────────────────────┐
│ 2019-01-18 14:27:32 │ REGULAR │ The second regular message │
│ 2019-01-18 14:34:53 │ WARNING │ The first warning message │
└─────────────────────┴──────────────┴────────────────────────────┘
┌───────────timestamp─┬─message_type─┬─message───────────────────┐
│ 2019-01-18 14:23:43 │ REGULAR │ The first regular message │
└─────────────────────┴──────────────┴───────────────────────────┘فرز النتائج (تصاعديًا افتراضيًا):
SELECT * FROM log_table ORDER BY timestamp┌───────────timestamp─┬─message_type─┬─message────────────────────┐
│ 2019-01-18 14:23:43 │ REGULAR │ The first regular message │
│ 2019-01-18 14:27:32 │ REGULAR │ The second regular message │
│ 2019-01-18 14:34:53 │ WARNING │ The first warning message │
└─────────────────────┴──────────────┴────────────────────────────┘