0Pricing
AWS Solutions Architect · درس

الفهارس الثانوية العامة والفهارس الثانوية المحلية

أضيفوا GSI وLSI لدعم أنماط استعلام بديلة دون تكرار الجداول.

الفهارس الثانوية العامة والفهارس الثانوية المحلية درس مجاني في AWS Solutions Architect على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AWS Solutions Architect، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AWS Solutions Architect 4 دروس في المجموع.

سبب وجود الفهارس الثانوية

يحدد المفتاح الأساسي في DynamoDB مسار الاستعلام الفعال الوحيد في الجدول. إذا احتجتم إلى الاستعلام عن العناصر باستخدام سمة مختلفة—مثل البحث عن جميع الطلبات لمعرّف منتج عندما يكون مفتاح قسم الجدول هو CustomerId—فسيتعين عليكم إجراء عملية Scan مكلفة دون فهرس ثانوي.

تحل الفهارس الثانوية هذه المشكلة من خلال الاحتفاظ بنسخة منفصلة من البيانات، يتم تحديثها تلقائيًا، ومهيكلة حول مفتاح مختلف. توفر DynamoDB نوعين: الفهارس الثانوية العامة (GSI) والفهارس الثانوية المحلية (LSI)، ولكل منهما مقايضات مختلفة.

أساسيات الفهرس الثانوي العام (GSI)

يتيح لكم الفهرس الثانوي العام تحديد مفتاح قسم مختلف تمامًا (ومفتاح فرز اختياري) عن مفتاح الجدول الأساسي. ويُعد GSI عامًا بالفعل، إذ يمتد عبر جميع أقسام الجدول الأساسي. يمكنكم الاستعلام عن GSI للعثور على العناصر باستخدام أي سمة تحددونها مفتاحَ قسم للفهرس.

لدى GSIs معدل نقل موفّر خاص بها (أو ترث نمط الطلب عند الحاجة) مستقل عن الجدول الأساسي. يمكنكم إنشاء ما يصل إلى 20 فهرس GSI لكل جدول، كما يمكنكم إضافة GSIs أو حذفها في أي وقت من جدول موجود.

# Create a table with a GSI on ProductId
aws dynamodb create-table \
  --table-name Orders \
  --attribute-definitions \
    AttributeName=OrderId,AttributeType=S \
    AttributeName=ProductId,AttributeType=S \
    AttributeName=OrderDate,AttributeType=S \
  --key-schema AttributeName=OrderId,KeyType=HASH \
  --global-secondary-indexes '[
    {
      "IndexName": "ProductId-OrderDate-index",
      "KeySchema": [
        {"AttributeName": "ProductId", "KeyType": "HASH"},
        {"AttributeName": "OrderDate", "KeyType": "RANGE"}
      ],
      "Projection": {"ProjectionType": "ALL"},
      "ProvisionedThroughput": {"ReadCapacityUnits": 10, "WriteCapacityUnits": 5}
    }
  ]' \
  --provisioned-throughput ReadCapacityUnits=10,WriteCapacityUnits=5

أساسيات الفهرس الثانوي المحلي (LSI)

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

يجب تعريف LSIs وقت إنشاء الجدول، ولا يمكنكم إضافتها أو حذفها لاحقًا. ويمكن أن يحتوي كل جدول على ما يصل إلى 5 فهارس LSI. وتشترك LSIs في السعة الموفّرة للجدول الأساسي (من دون معدل نقل منفصل)، وتخضع لحد التخزين البالغ 10 غيغابايت لكل مفتاح قسم، وذلك لمجموع بيانات الجدول الأساسي وبيانات LSI.

# Create a table with an LSI (at creation time only)
aws dynamodb create-table \
  --table-name Orders \
  --attribute-definitions \
    AttributeName=CustomerId,AttributeType=S \
    AttributeName=OrderDate,AttributeType=S \
    AttributeName=TotalAmount,AttributeType=N \
  --key-schema \
    AttributeName=CustomerId,KeyType=HASH \
    AttributeName=OrderDate,KeyType=RANGE \
  --local-secondary-indexes '[{
    "IndexName": "TotalAmount-index",
    "KeySchema": [
      {"AttributeName": "CustomerId", "KeyType": "HASH"},
      {"AttributeName": "TotalAmount", "KeyType": "RANGE"}
    ],
    "Projection": {"ProjectionType": "ALL"}
  }]' \
  --billing-mode PAY_PER_REQUEST

GSI مقابل LSI: الفروقات الرئيسية

إليكم مقارنة جنبًا إلى جنب لتوضيح النقاط المهمة في الاختبار:

  • مفتاح التقسيم: يمكن أن يختلف في GSI عن الجدول الأساسي، بينما يجب أن يطابقه في LSI
  • مفتاح الفرز: يدعم كلاهما مفتاح فرز مختلفًا عن مفتاح الجدول الأساسي
  • وقت الإنشاء: يمكن إنشاء GSI في أي وقت، بينما لا يمكن إنشاء LSI إلا عند إنشاء الجدول
  • معدل النقل: لدى GSI معدل نقل خاص به، بينما يشترك LSI في معدل نقل الجدول الأساسي
  • الاتساق: تكون قراءات GSI متسقة بشكل نهائي فقط، بينما يمكن أن تكون قراءات LSI متسقة بشكل قوي
  • الحدود: ما يصل إلى 20 من GSIs، وما يصل إلى 5 من LSIs لكل جدول

أنواع الإسقاط

عند إنشاء فهرس، تختار السمات التي يتم إسقاطها (نسخها) إليه:

  • KEYS_ONLY: يضم فقط المفتاح الأساسي للجدول الأساسي ومفتاح الفهرس—وهو أصغر أنواع الفهارس، لكنه يتطلب استدعاءات GetItem إضافية للسمات غير المفتاحية
  • INCLUDE: يضم السمات المفتاحية بالإضافة إلى قائمة محددة من السمات الإضافية التي تسميها—وهو يوازن بين الحجم ونمط الوصول
  • ALL: تُسقط جميع السمات إلى الفهرس—وهو الأكثر مرونة، لكنه يتطلب مساحة تخزين أكبر وتكلفة كتابة أعلى

اختَر نوع الإسقاط استنادًا إلى السمات التي تحتاج إليها استعلاماتك فعليًا. يؤدي الإسقاط الزائد إلى هدر WCUs مع كل عملية كتابة، بينما يفرض الإسقاط غير الكافي استدعاءات GetItem إضافية لجلب السمات غير الموجودة في الفهرس.

الاستعلام باستخدام GSI

يستخدم الاستعلام باستخدام GSI واجهة برمجة التطبيقات Query نفسها، لكنه يحدد المعامل --index-name. يُنفَّذ الاستعلام باستخدام مخطط مفاتيح GSI بدلًا من مخطط الجدول الأساسي. تكون استعلامات GSI متسقة بشكل نهائي دائمًا—إذ يُحدَّث GSI بشكل غير متزامن بعد عمليات الكتابة على الجدول الأساسي، ولذلك قد يحدث تأخر قصير.

إذا لم يكن لعنصر في الجدول الأساسي سمة مفتاح التقسيم الخاصة بـ GSI، فلن يُضمَّن العنصر في GSI إطلاقًا (وهو نمط الفهرس المتناثر). وتُعد هذه تقنية فعّالة لفهرسة مجموعة فرعية فقط من العناصر، مثل جميع الطلبات التي تكون حالتها PENDING إذا كان مفتاح تقسيم GSI هو Status.

# Query the GSI for all orders for a product in 2026
aws dynamodb query \
  --table-name Orders \
  --index-name ProductId-OrderDate-index \
  --key-condition-expression 'ProductId = :pid AND OrderDate BETWEEN :start AND :end' \
  --expression-attribute-values \
    '{":pid":{"S":"prod-abc"},":start":{"S":"2026-01-01"},":end":{"S":"2026-12-31"}}'

نمط الفهرس المتناثر

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

مثال: في جدول Orders، لا تحتوي على السمة PendingShipmentDate إلا الطلبات التي لم تُشحن. لذلك سيحتوي GSI المستند إلى PendingShipmentDate طبيعيًا على الطلبات غير المشحونة فقط، ما يجعله وسيلة فعّالة جدًا للاستعلام عن جميع الطلبات المعلّقة دون إجراء مسح للجدول بأكمله.

تقسيم الكتابة باستخدام التحميل الزائد لـ GSI

التحميل الزائد لـ GSI هو تقنية متقدمة لتصميم جدول واحد، حيث تخزّن أنواعًا مختلفة من الكيانات في جدول واحد، وتستخدم سمة مفتاح عامة لـ GSI (مثل GSI1PK وGSI1SK) وتملؤها بأنماط مختلفة وفقًا لنوع العنصر. ويمنح ذلك كل نوع كيان مسار استعلام فعّالًا خاصًا به عبر GSI واحد.

مثال: بالنسبة إلى عناصر User، عيّن GSI1PK = 'COUNTRY#US' وGSI1SK = username؛ وبالنسبة إلى عناصر Order، عيّن GSI1PK = 'STATUS#PENDING' وGSI1SK = orderDate. يؤدي الاستعلام في GSI باستخدام البادئة المناسبة إلى استرداد نوع الكيان المستهدف بكفاءة.

اختناق الفهرس وسعته

يحدث اختناق GSI بشكل مستقل عن الجدول الأساسي. فإذا كانت WCUs المخصّصة لـ GSI منخفضة جدًا، فستتعرض عمليات الكتابة على العناصر التي تُسقط إلى GSI للاختناق—حتى إذا كانت سعة الجدول الأساسي وفيرة. راقب ConsumedWriteCapacityUnits وThrottledRequests لكل GSI على حدة.

من الأخطاء الشائعة تخصيص سعة لـ GSI أقل من سعة الجدول الأساسي، ثم مواجهة الاختناق عند ارتفاع معدل الكتابة إلى GSI فجأةً بسبب تغير نمط الكتابة. استخدم Auto Scaling مع GSIs أو اختر وضع On-Demand لتجنب ذلك.

متى تستخدم GSI أو LSI أو تعيد التصميم

إرشادات اتخاذ القرار لاختبار SAA-C03:

  • تحتاج إلى الاستعلام باستخدام سمة مختلفة تمامًا → GSI
  • تحتاج إلى الاستعلام داخل القسم نفسه ولكن بترتيب مختلف، وتعرف ذلك وقت الإنشاء → LSI
  • تحتاج إلى قراءات متسقة بشكل قوي باستخدام مفتاح فرز بديل → LSI (الخيار الوحيد، لأن GSIs متسقة بشكل نهائي)
  • لديك عشرة أنماط استعلام مميزة أو أكثر → فكّر في تصميم جدول واحد مع التحميل الزائد لـ GSI بدلًا من إنشاء جداول منفصلة عديدة
  • تحتاج فقط إلى استرداد جميع العناصر للتحليل → أعد النظر في ما إذا كان DynamoDB قاعدة البيانات المناسبة

حذف GSIs وإكمال تعبئتها

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

يمكنك مراقبة تقدم إكمال التعبئة من وحدة التحكم أو عبر واجهة برمجة التطبيقات DescribeTable من خلال التحقق من الحقل IndexStatus الخاص بالفهرس—حيث تكون قيمته CREATING أثناء إكمال التعبئة وACTIVE عند اكتماله. لا تُجرِ استعلامات على GSI قبل أن تصبح قيمته ACTIVE.

# Check GSI status during backfill
aws dynamodb describe-table \
  --table-name Orders \
  --query 'Table.GlobalSecondaryIndexes[*].{Name:IndexName,Status:IndexStatus}'

تحقق سريع

اختبر مدى فهمك لمفاهيم AWS Solutions Architect (SAA-C03) الواردة في هذا الدرس.

مراجعة الدرس

تعلّمت في هذا الدرس أن: GSIs توفر مفاتيح تقسيم بديلة ويمكن إضافتها في أي وقت، وLSIs تشترك في مفتاح تقسيم الجدول الأساسي ويجب تعريفها عند الإنشاء، وأن أنواع الإسقاط تتحكم في السمات التي تُنسخ إلى الفهرس. كما تدعم GSIs أنماط الفهرس المتناثر والتحميل الزائد لتوفير مرونة متقدمة في الاستعلامات. في الدرس التالي، سنستكشف DynamoDB Streams وGlobal Tables.

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

هل درس «الفهارس الثانوية العامة والفهارس الثانوية المحلية» مجاني؟

نعم — نص درس «الفهارس الثانوية العامة والفهارس الثانوية المحلية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AWS Solutions Architect، انتقل إلى CoddyKit PRO. تتضمن دورة AWS Solutions Architect 4 دروس في المجموع.

ماذا ستتعلم في «الفهارس الثانوية العامة والفهارس الثانوية المحلية»؟

أضيفوا GSI وLSI لدعم أنماط استعلام بديلة دون تكرار الجداول. تتمرن على AWS Solutions Architect مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AWS Solutions Architect؟

لا تُشترط خبرة سابقة. AWS Solutions Architect على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «الفهارس الثانوية العامة والفهارس الثانوية المحلية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AWS Solutions Architect هذا؟

نعم. كل درس في AWS Solutions Architect يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الجداول والعناصر والمفاتيح الأساسية
  2. السعة المُوفّرة مقابل عند الطلب
  3. الفهارس الثانوية العامة والفهارس الثانوية المحلية
  4. تدفقات DynamoDB والجداول العامة
← العودة إلى AWS Solutions Architect