Cassandra لغة الاستعلام (CQL): إدراج، تحديث، حذف

⚡ ملخص ذكي

Cassandra تتعامل لغة الاستعلام مع عمليات الإدراج والتحديث والحذف والقراءة باستخدام بنية قريبة من لغة SQL ولكن بدلالات مختلفة. تشرح هذه الصفحة كل عبارة، وسلوك عملية الإدراج والتحديث التي تدمج الإدراج والتحديث، والحدود الفعلية لعبارة WHERE.

  • ➕ أدخل السلوك: المفتاح الأساسي فقط هو الإلزامي، والأعمدة المحذوفة لا تستهلك أي مساحة تخزين.
  • 🔄 دلالات التحديث والإضافة: عملية الإضافة والتحديث هي نفس العملية، لذا فإن كتابة مفتاح موجود يؤدي إلى استبداله بصمت.
  • 🗑️ تكلفة الحذف: تصبح الصفوف المحذوفة بمثابة شواهد قبور ولا تختفي إلا بعد عمليات الضغط.
  • 🔍 حدود البند: يعمل التصفية على أعمدة المفتاح الأساسي، أو على أعمدة أخرى بمجرد وجود فهرس.
  • 📊 الدعم الإجمالي: العدد، الحد الأدنى، الحد الأقصى، المجموع AVG يتم دعم GROUP BY، ولكن بكفاءة فقط داخل قسم واحد.
  • 🚫 لا يزال غير مدعوم: تبقى عمليات الربط، وشروط OR، وتحليلات الأقسام المتقاطعة خارج نطاق CQL بحكم التصميم.

Cassandra إدراج تحديث حذف CQL

أدخل البيانات

استخدم Cassandra عبارة الإدراج تكتب البيانات فيها Cassandra أعمدة على شكل صف. Cassandra سيقوم استعلام الإدراج بتخزين الأعمدة التي قدمها المستخدم فقط. يجب عليك بالضرورة تحديد عمود المفتاح الأساسي فقط.

لن يستغرق الأمر أي مساحة للقيم غير المحددة. لا يتم إرجاع أي نتائج بعد الإدراج.

بناء الجملة

INSERT INTO KeyspaceName.TableName (ColumnName1, ColumnName2, ColumnName3)
VALUES (Column1Value, Column2Value, Column3Value);

مثال

وهنا لقطة من الإعدام Cassandra إدراج في استعلام الجدول الذي سيؤدي إلى إدراج سجل واحد فيه Cassandra جدول "الطالب".

أدخل البيانات

INSERT INTO University.Student (RollNo, Name, dept, Semester)
VALUES (2, 'Michael', 'CS', 2);

بعد التنفيذ الناجح للأمر أدخل في Cassandra، سيتم إدراج صف واحد في Cassandra طالب الجدول رقم 2، الاسم مايكل، قسم علوم الكمبيوتر والفصل الدراسي 2.

فيما يلي لقطة لحالة قاعدة البيانات الحالية.

أدخل البيانات

رفع البيانات

Cassandra لا يزعج. Upsert يعني ذلك Cassandra سيتم إدراج صف إذا لم يكن المفتاح الأساسي موجودًا بالفعل، وإلا إذا كان المفتاح الأساسي موجودًا بالفعل، فسيتم تحديث هذا الصف.

لهذا الأمر تبعات عملية جديرة بالتوضيح: لا يُبلغ أمر INSERT عن خطأ المفتاح المكرر، لذا فإن إعادة الإدخال غير المقصودة تستبدل الصف الموجود دون سابق إنذار. ولمنع حدوث ذلك، أضف عبارة IF NOT EXISTS لجعل العملية سريعة وخفيفة.

INSERT INTO University.Student (RollNo, Name)
VALUES (2, 'Michael') IF NOT EXISTS;

تستخدم المعاملات الخفيفة جولة توافق آراء عبر النسخ المتماثلة، لذا فهي أبطأ بكثير من عملية الكتابة العادية ويجب حجزها للحالات التي تحتاج إلى التحقق بالفعل.

تحديث البيانات

استخدم Cassandra يتم استخدام استعلام التحديث لتحديث البيانات في Cassandra جدولإذا لم يتم إرجاع أي نتائج بعد تحديث البيانات، فهذا يعني أن البيانات تم تحديثها بنجاح وإلا فسيتم إرجاع خطأ. يتم تغيير قيم الأعمدة في بند "Set" بينما يتم تصفية البيانات باستخدام بند "Where".

بناء الجملة

UPDATE KeyspaceName.TableName
SET ColumnName1 = NewValue1,
    ColumnName2 = NewValue2
WHERE ColumnName = ColumnValue;

مثال

فيما يلي لقطة الشاشة التي توضح حالة قاعدة البيانات قبل تحديث البيانات.

تحديث البيانات

وهنا لقطة من الإعدام Cassandra أمر التحديث الذي يقوم بتحديث السجل في جدول الطالب.

تحديث البيانات

UPDATE University.Student
SET name = 'Hayden'
WHERE rollno = 1;

بعد التنفيذ الناجح لاستعلام التحديث في Cassandra "تحديث الطالب"، سيتم تغيير اسم الطالب من "كلارك" إلى "هايدن" الذي يحمل الرقم 1.

فيما يلي لقطة الشاشة التي توضح حالة قاعدة البيانات بعد تحديث البيانات.

تحديث البيانات

بسبب سلوك التحديث والإدراج، فإن عملية التحديث على مفتاح أساسي غير موجود تنشئ الصف بدلاً من أن تفشل.

Cassandra حذف البيانات

يقوم الأمر "حذف" بإزالة صف كامل أو بعض الأعمدة من جدول الطالب. عند حذف البيانات، لا يتم حذفها من الجدول على الفور. وبدلاً من ذلك، يتم تمييز البيانات المحذوفة بعلامة مميزة وتتم إزالتها بعد الضغط.

بناء الجملة

DELETE FROM KeyspaceName.TableName
WHERE ColumnName1 = ColumnValue;

ما سبق Cassandra سيؤدي بناء جملة حذف الصف إلى حذف صف واحد أو أكثر بناءً على تصفية البيانات في جملة المكان.

DELETE ColumnName1, ColumnName2 FROM KeyspaceName.TableName
WHERE ColumnName1 = ColumnValue;

سيؤدي بناء الجملة أعلاه إلى حذف بعض الأعمدة من الجدول.

مثال

فيما يلي اللقطة التي توضح حالة قاعدة البيانات الحالية قبل حذف البيانات.

Cassandra حذف البيانات

فيما يلي لقطة للأمر الذي سيؤدي إلى إزالة صف واحد من جدول الطالب.

Cassandra حذف البيانات

DELETE FROM University.Student WHERE rollno = 1;

بعد التنفيذ الناجح لأمر الحذف CQL، سيتم حذف صف واحد من جدول الطلاب حيث تكون قيمة rollno هي 1.

فيما يلي اللقطة التي توضح حالة قاعدة البيانات بعد حذف البيانات.

Cassandra حذف البيانات

تبقى علامات الحذف محفوظة لمدة gc_grace_seconds، أي عشرة أيام افتراضيًا، بحيث لا يمكن للعقدة غير المتصلة بالإنترنت أثناء الحذف استعادة الصف عند عودتها. وبالتالي، فإن حذف وحدات تخزين كبيرة يترك علامات يجب على كل عملية قراءة لاحقة تجاوزها.

ابحث عن Cassandra لا يدعم

تستعير لغة CQL صيغة SQL ولكن ليس نموذج التنفيذ العلائقي، لذلك فإن العديد من البنى المألوفة تتصرف بشكل مختلف أو تكون غائبة.

  1. لا يدعم CQL عمليات الربط بين الجداول. يجب إلغاء تطبيع البيانات المرتبطة في جدول واحد عند الكتابة.
  2. لا يدعم CQL شروط OR في جملة WHERE. استخدم IN على عمود واحد، أو قم بتشغيل استعلامات منفصلة.
  3. لا يدعم CQL عمليات UNION أو INTERSECT.
  4. لا يمكن تصفية الأعمدة غير المفتاح الأساسي إلا بعد وجود فهرس عليها.
  5. تنطبق مقارنات أكبر من وأصغر من فقط على أعمدة التجميع، لأن هذه الأعمدة فقط هي التي يتم فرزها على القرص.
  6. تتطلب مطابقة الأنماط باستخدام LIKE فهرس SASI وهي غير متاحة على الأعمدة العادية.

هناك ادعاء قديم يحتاج إلى تصحيح. يتم دعم الدوال التجميعية. العد، الحد الأدنى، الحد الأقصى، المجموع و AVG وصلت في Cassandra 2.2، و GROUP BY وصل في الإصدار 3.10. لكن المشكلة تكمن في النطاق وليس في التوافر.

SELECT dept, COUNT(*) FROM University.Student
WHERE RollNo = 1 GROUP BY dept;

عند اقتصارها على قسم واحد كما هو موضح أعلاه، تكون عملية التجميع فعالة. أما عند تطبيقها على الجدول بأكمله، فإنها تتحول إلى مسح شامل للمجموعة، وهذا هو السبب. Cassandra لا يزال غير مناسب للتحليلات المخصصة، ولهذا السبب يتم عادةً دفع التقارير المكثفة إلى Spark أو مستودع خارجي.

Cassandra حيث البند

In Cassandra، يعد استرداد البيانات مسألة حساسة. يتم تصفية العمود في Cassandra عن طريق إنشاء فهرس على أعمدة المفاتيح غير الأساسية.

بناء الجملة

SELECT ColumnNames FROM KeyspaceName.TableName
WHERE ColumnName1 = Column1Value
  AND ColumnName2 = Column2Value;

مثال

  • فيما يلي اللقطة التي توضح استرداد البيانات من جدول الطالب دون تصفية البيانات.

Cassandra حيث البند

SELECT * FROM University.Student;

يتم استرداد سجلين من جدول الطالب.

  • فيما يلي اللقطة التي توضح استرداد البيانات من الطالب باستخدام تصفية البيانات. يتم استرداد سجل واحد.

يتم تصفية البيانات حسب عمود الاسم. يتم استرجاع جميع السجلات التي يكون اسمها مساوياً لـ Guru99.

Cassandra حيث البند

SELECT * FROM University.Student WHERE name = 'Guru99';

تستمد القواعد التي تحكم الأعمدة التي يمكن أن تشير إليها عبارة WHERE مباشرة من المفتاح الأساسي.

  • استخدم مفتاح التقسيم يجب توفيرها بالكامل لأي استعلام فعال، لأنها تحدد العقدة التي تحتوي على البيانات.
  • Clusterأعمدة الإدخال قد تُفرض قيود عليها، ولكن فقط بالترتيب الذي أُعلنت به. تخطيping يتم رفض أحدهما.
  • يُسمح بإجراء مقارنات النطاقات على عمود التجميع الأخير المشار إليه، وليس على الأعمدة السابقة.
  • اي عمود آخر يحتاج إلى فهرس ثانوي، وهو ما تم تغطيته في إنشاء وحذف الفهرس البرنامج التعليمي.

عند رفض الاستعلام، Cassandra غالباً ما يُقترح إضافة ALLOW FILTERING. تعامل مع ذلك على أنه تحذير وليس حلاً: فهو يفحص كل قسم على كل عقدة، وتغيير المخطط هو الاستجابة الصحيحة في أغلب الأحيان.

الأسئلة الشائعة

تُجمّع عملية المعالجة الدفعية العبارات بحيث تنجح أو تفشل معًا. استخدمها للحفاظ على تزامن الجداول المكررة، وليس للتحميل المجمع، حيث أن المعالجة الدفعية عبر العديد من الأقسام تُبطئ المنسق بشكل كبير.

يتم تحديث صفحات برامج التشغيل تلقائيًا باستخدام رمز حالة الترحيل. في cqlsh، يحدد PAGING الحجم. تجنب محاكاة OFFSET باستخدام عداد، لأن Cassandra لا يوجد بها تخطي صف فعالping آلية.

إذا تعطلت نسخة احتياطية لفترة أطول من gc_grace_seconds وتم ضغط علامة الحذف بالفعل، فإن تلك النسخة الاحتياطية لا تزال تحتفظ بالصف القديم وتعيد نشره. ويمنع الإصلاح المنتظم حدوث ذلك.

تُحقق عمليات تحديد الجدول الواحد البسيطة نتائج جيدة. أما عمليات الربط أو OR أو الاستعلامات الفرعية، فلا يوجد لها مكافئ مباشر في لغة CQL، وغالبًا ما تُغطي تقنيات الذكاء الاصطناعي هذه الفجوة باستخدام ALLOW FILTERING، وهو ليس حلاً.

نعم. لصق TRACعادةً ما يُظهر ناتج الأمر ING ON قراءةً واضحةً لعمليات مسح علامات الحذف، أو الأقسام الواسعة، أو عمليات النقل بين العقد. تحقق من تغيير المخطط المقترح على نسخة قبل تطبيقه.

تلخيص هذه التدوينة بـ: