ดัชนีรองระดับโลกและดัชนีรองเฉพาะที่
เพิ่ม GSI และ LSI เพื่อรองรับรูปแบบการสืบค้นทางเลือกโดยไม่ต้องทำซ้ำตาราง
ดัชนีรองระดับโลกและดัชนีรองเฉพาะที่ เป็นบทเรียน Cloud & IT Cert Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Cloud & IT Cert Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Cloud & IT Cert Prep มีบทเรียนทั้งหมด 4 บทเรียน
เหตุผลที่มีดัชนีรอง
คีย์หลักของ DynamoDB กำหนดเส้นทางการสืบค้นที่มีประสิทธิภาพเพียงเส้นทางเดียวในตาราง หากคุณต้องการสืบค้นรายการข้อมูลด้วยแอตทริบิวต์อื่น—เช่น ต้องการค้นหาคำสั่งซื้อทั้งหมดของรหัสสินค้า ขณะที่คีย์พาร์ทิชันของตารางคือ CustomerId—คุณจะต้องดำเนินการ Scan ซึ่งมีค่าใช้จ่ายสูง หากไม่มีดัชนีรอง
ดัชนีรองแก้ปัญหานี้ด้วยการดูแลสำเนาข้อมูลแยกต่างหากที่อัปเดตโดยอัตโนมัติ และจัดโครงสร้างตามคีย์อื่น DynamoDB มีดัชนีรองสองประเภท ได้แก่ Global Secondary Indexes (GSI) และ Local Secondary Indexes (LSI) ซึ่งมีข้อแลกเปลี่ยนแตกต่างกัน
พื้นฐาน Global Secondary Index (GSI)
Global Secondary Indexช่วยให้คุณกำหนดคีย์พาร์ทิชันที่แตกต่างจากตารางหลักโดยสิ้นเชิง (และอาจกำหนดคีย์เรียงลำดับเพิ่มเติมได้) GSI เป็นแบบโกลบอลอย่างแท้จริง โดยครอบคลุมทุกพาร์ทิชันของตารางหลัก คุณสามารถสืบค้น GSI เพื่อค้นหารายการข้อมูลด้วยแอตทริบิวต์ใดก็ได้ที่คุณกำหนดให้เป็นคีย์พาร์ทิชันของ GSI
GSI มีอัตราการประมวลผลแบบจัดสรรล่วงหน้าของตนเอง (หรือสืบทอดโหมดตามการใช้งานจริง) โดยเป็นอิสระจากตารางหลัก คุณสามารถสร้าง GSI ได้สูงสุด 20 รายการต่อตาราง และสามารถเพิ่มหรือลบ GSI ได้ทุกเมื่อบนตารางที่มีอยู่
# 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พื้นฐาน Local Secondary Index (LSI)
Local Secondary Indexใช้คีย์พาร์ทิชันเดียวกับตารางหลัก แต่ใช้คีย์เรียงลำดับที่แตกต่างกัน LSI เป็นแบบ 'เฉพาะที่' เพราะสืบค้นได้เฉพาะภายในพาร์ทิชันเดียว (รายการข้อมูลที่มีคีย์พาร์ทิชันเดียวกัน) จึงเหมาะอย่างยิ่งสำหรับการสืบค้นคำสั่งซื้อของลูกค้ารายใดรายหนึ่ง โดยเรียงลำดับตามแอตทริบิวต์ที่แตกต่างกัน
ต้องกำหนด LSI ในขณะที่สร้างตาราง—คุณไม่สามารถเพิ่มหรือลบ LSI ในภายหลังได้ แต่ละตารางมี LSI ได้สูงสุด 5 รายการ LSI ใช้ความจุแบบจัดสรรล่วงหน้าร่วมกับตารางหลัก (ไม่มีอัตราการประมวลผลแยกต่างหาก) และอยู่ภายใต้ขีดจำกัดพื้นที่จัดเก็บ 10 GB ต่อคีย์พาร์ทิชัน สำหรับข้อมูลรวมของตารางหลักและ 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 สามารถมีความสอดคล้องอย่างเข้มงวดได้
- ข้อจำกัด: มี GSI ได้สูงสุด 20 รายการ และมี LSI ได้สูงสุด 5 รายการต่อตาราง
ประเภทการฉายข้อมูล
เมื่อสร้างดัชนี คุณจะเลือกแอตทริบิวต์ที่จะ ฉาย (คัดลอก) เข้าไปในดัชนีนั้น:
- KEYS_ONLY: มีเฉพาะคีย์หลักของตารางฐานและคีย์ของดัชนีเท่านั้น ดัชนีมีขนาดเล็กที่สุด แต่ต้องเรียก GetItem เพิ่มเติมสำหรับแอตทริบิวต์ที่ไม่ใช่คีย์
- INCLUDE: มีแอตทริบิวต์คีย์และรายการแอตทริบิวต์เพิ่มเติมที่คุณระบุ ช่วยสร้างสมดุลระหว่างขนาดกับรูปแบบการเข้าถึง
- ALL: ฉายแอตทริบิวต์ทั้งหมดเข้าไปในดัชนี มีความยืดหยุ่นมากที่สุด แต่มีค่าใช้จ่ายด้านพื้นที่จัดเก็บและการเขียนสูงกว่า
เลือกประเภทการฉายข้อมูลตามแอตทริบิวต์ที่การสืบค้นของคุณต้องใช้จริง การฉายข้อมูลมากเกินไปทำให้สิ้นเปลือง WCU ในทุกการเขียน ส่วนการฉายข้อมูลน้อยเกินไปจะบังคับให้ต้องเรียก GetItem เพิ่มเติมเพื่อดึงแอตทริบิวต์ที่ไม่มีอยู่ในดัชนี
การสืบค้น GSI
การสืบค้น GSI ใช้ API 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 เกิดขึ้นแยกจากตารางฐาน หาก WCU ที่จัดสรรให้ GSI ต่ำเกินไป การเขียนรายการที่ถูกฉายเข้าไปใน GSI จะถูกจำกัดปริมาณ แม้ว่าตารางฐานจะมีความจุเหลือเฟือก็ตาม ให้ตรวจสอบ ConsumedWriteCapacityUnits และ ThrottledRequests ของ GSI แต่ละรายการแยกกัน
ข้อผิดพลาดที่พบบ่อยคือการจัดสรรความจุให้ GSI ต่ำกว่าตารางฐาน แล้วพบว่าการเขียนถูกจำกัดปริมาณเมื่อรูปแบบการเขียนเพิ่มอัตราการเขียนไปยัง GSI อย่างกะทันหัน ให้ใช้การปรับขนาดอัตโนมัติกับ GSI หรือเลือกโหมดตามการใช้งานจริงเพื่อหลีกเลี่ยงปัญหานี้
ควรใช้ GSI, LSI หรือออกแบบใหม่เมื่อใด
แนวทางการตัดสินใจสำหรับการสอบ SAA-C03:
- ต้องการสืบค้นด้วยแอตทริบิวต์ที่แตกต่างออกไปโดยสิ้นเชิง → GSI
- ต้องการสืบค้นภายในพาร์ทิชันเดียวกันแต่เรียงลำดับต่างกัน และทราบความต้องการนี้ตั้งแต่ตอนสร้าง → LSI
- ต้องการการอ่านที่มีความสอดคล้องอย่างเข้มงวดด้วยคีย์เรียงลำดับสำรอง → LSI (เป็นตัวเลือกเดียว เนื่องจาก GSI มีความสอดคล้องในท้ายที่สุด)
- มีรูปแบบการสืบค้นที่แตกต่างกันตั้งแต่สิบรูปแบบขึ้นไป → ควรพิจารณาการออกแบบตารางเดียวด้วยการใช้ GSI ซ้ำหลายรูปแบบแทนการสร้างหลายตารางแยกกัน
- ต้องการเพียงดึงรายการทั้งหมดไปวิเคราะห์ → ควรทบทวนว่า DynamoDB เป็นฐานข้อมูลที่เหมาะสมหรือไม่
การลบและเติมข้อมูลย้อนหลังใน GSI
คุณสามารถลบ GSI ได้ทุกเมื่อโดยไม่กระทบต่อตารางฐาน เมื่อเพิ่ม GSI ใหม่ลงในตารางที่มีอยู่แล้ว DynamoDB จะเติมข้อมูลย้อนหลังให้ดัชนีแบบอะซิงโครนัสด้วยการสแกนตารางฐาน ซึ่งอาจใช้เวลาตั้งแต่นาทีจนถึงหลายชั่วโมงสำหรับตารางขนาดใหญ่ ระหว่างการเติมข้อมูลย้อนหลัง ตารางฐานยังคงพร้อมใช้งานเต็มรูปแบบสำหรับการอ่านและการเขียน
คุณสามารถตรวจสอบความคืบหน้าของการเติมข้อมูลย้อนหลังได้ในคอนโซลหรือผ่าน API 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) จากบทเรียนนี้
ทบทวนบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า GSI มีคีย์พาร์ทิชันสำรองและสามารถเพิ่มได้ทุกเมื่อ ส่วน LSI ใช้คีย์พาร์ทิชันร่วมกับตารางฐานและต้องกำหนดตั้งแต่ตอนสร้าง และประเภทการฉายข้อมูลจะควบคุมว่าแอตทริบิวต์ใดถูกคัดลอกไปยังดัชนี GSI รองรับรูปแบบดัชนีแบบเบาบางและการใช้ GSI ซ้ำหลายรูปแบบเพื่อเพิ่มความยืดหยุ่นในการสืบค้นขั้นสูง บทถัดไปเราจะสำรวจ DynamoDB Streams และตาราง Global
คำถามที่พบบ่อย
บทเรียน “ดัชนีรองระดับโลกและดัชนีรองเฉพาะที่” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ดัชนีรองระดับโลกและดัชนีรองเฉพาะที่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Cloud & IT Cert Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Cloud & IT Cert Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ดัชนีรองระดับโลกและดัชนีรองเฉพาะที่”
เพิ่ม GSI และ LSI เพื่อรองรับรูปแบบการสืบค้นทางเลือกโดยไม่ต้องทำซ้ำตาราง คุณปฏิบัติ Cloud & IT Cert Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Cloud & IT Cert Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Cloud & IT Cert Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “ดัชนีรองระดับโลกและดัชนีรองเฉพาะที่” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Cloud & IT Cert Prep นี้ได้ไหม
ได้ บทเรียน Cloud & IT Cert Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ตาราง รายการ และคีย์หลัก
- ความจุแบบจัดสรรเทียบกับแบบตามต้องการ
- ดัชนีรองระดับโลกและดัชนีรองเฉพาะที่
- สตรีม DynamoDB และตารางทั่วโลก