สร้างและวาง INDEX เข้าไป Cassandra

⚡ สรุปอย่างชาญฉลาด

สร้างและลบดัชนีใน Cassandra ฟังก์ชันนี้ช่วยให้สามารถกรองข้อมูลในคอลัมน์ที่ไม่ใช่ส่วนหนึ่งของคีย์หลักได้ หน้านี้ครอบคลุมคำสั่ง CREATE INDEX และ DROP INDEX กฎการตั้งชื่อ ประเภทของดัชนีที่มีให้เลือก และกรณีที่การใช้ดัชนีไม่ใช่ทางออกที่เหมาะสม

  • 🔎 เหตุผลที่ควรใช้ Index: หากไม่มีดัชนี เงื่อนไข WHERE จะอ้างอิงได้เฉพาะคอลัมน์คีย์หลักเท่านั้น
  • 🏷️ กฎการตั้งชื่อ: มีการสร้างดัชนีที่ไม่มีชื่อขึ้นมาในชื่อ TableName_ColumnName_idx และจะต้องลบดัชนีนั้นโดยใช้ชื่อดังกล่าว
  • 🔁 การบำรุงรักษาอัตโนมัติ: แถวที่มีอยู่แล้วจะถูกสร้างดัชนีเมื่อสร้างขึ้น และแถวใหม่จะถูกสร้างดัชนีเมื่อเขียนโดยไม่ต้องดำเนินการใดๆ เพิ่มเติม
  • ???? ข้อ จำกัด : คอลัมน์คีย์หลักได้รับการสร้างดัชนีไว้แล้ว ดังนั้นการสร้างดัชนีรองบนคอลัมน์เหล่านั้นจึงไม่จำเป็น
  • 📉 ความสำคัญของจำนวนสมาชิก: คอลัมน์ที่มีจำนวนค่าในตารางสูงมากหรือต่ำมากเกินไป จะทำให้การสร้างดัชนีช้าลงหรือไม่มีประโยชน์เลย
  • 🧱 ทางเลือกที่ดีกว่า: โดยทั่วไปแล้ว ตารางค้นหาที่สร้างขึ้นโดยเฉพาะจะมีประสิทธิภาพดีกว่าดัชนีรองเมื่อใช้งานในระดับขนาดใหญ่

สร้างและลบดัชนีใน Cassandra

Cassandra สร้างดัชนี

คำสั่ง 'สร้างดัชนี' สร้างดัชนีในคอลัมน์ที่ระบุโดยผู้ใช้ หากมีข้อมูลอยู่แล้วสำหรับคอลัมน์ที่คุณต้องการจัดทำดัชนี Cassandra สร้างดัชนีบนข้อมูลระหว่างการดำเนินการคำสั่ง 'สร้างดัชนี'

  • หลังจากสร้างดัชนีแล้ว Cassandra จัดทำดัชนีข้อมูลใหม่โดยอัตโนมัติเมื่อมีการแทรกข้อมูล
  • ไม่สามารถสร้างดัชนีบนคีย์หลักได้ เนื่องจากคีย์หลักได้รับการจัดทำดัชนีแล้ว
  • ระบบรองรับการสร้างดัชนีบนคอลัมน์ของชุดข้อมูล โดยใช้รูปแบบ KEYS, VALUES หรือ ENTRIES ขึ้นอยู่กับสิ่งที่ต้องการค้นหา
  • โดยไม่ต้องจัดทำดัชนีบนคอลัมน์ Cassandra ไม่สามารถกรองคอลัมน์นั้นได้ เว้นแต่ว่าจะเป็นคีย์หลัก

นั่นคือเหตุผลที่ต้องใช้การกรองคอลัมน์ใน Cassandraจำเป็นต้องสร้างดัชนี

วากยสัมพันธ์

CREATE INDEX IndexName ON KeyspaceName.TableName (ColumnName);

ตัวอย่าง

นี่คือภาพรวมที่พยายามกรองคอลัมน์ "แผนก" โดยไม่สร้างดัชนี เพื่อเป็นการตอบสนอง ข้อผิดพลาดจึงถูกส่งคืน

Cassandra สร้างดัชนี

นี่คือภาพรวมที่มีการสร้างดัชนีในคอลัมน์ฝ่าย

Cassandra สร้างดัชนี

CREATE INDEX DeptIndex ON University.Student (dept);

นี่คือภาพรวมที่คอลัมน์ 'แผนก' จะถูกกรองได้สำเร็จ

Cassandra สร้างดัชนี

SELECT * FROM University.Student WHERE dept = 'CS';

ชื่อดัชนีเป็นตัวเลือกเสริม การละเว้นชื่อดัชนีจะช่วยให้... Cassandra สร้างดัชนีโดยอัตโนมัติ ซึ่งมีความสำคัญเมื่อต้องลบดัชนีนั้นในภายหลัง

CREATE INDEX IF NOT EXISTS ON University.Student (dept);

Cassandra วางดัชนี

คำสั่ง 'วางดัชนี' จะปล่อยดัชนีที่ระบุ หากไม่ได้ระบุชื่อดัชนีในระหว่างการสร้างดัชนี ชื่อดัชนีจะเป็น TableName_ColumnName_idx

  • หากไม่มีดัชนีอยู่ ก็จะส่งคืนข้อผิดพลาด เว้นแต่ว่ามีการใช้ IF EXISTS ซึ่งจะส่งคืน no-op
  • คุณต้องระบุชื่อคีย์สเปซพร้อมกับชื่อดัชนี มิเช่นนั้นระบบจะค้นหาดัชนีในคีย์สเปซปัจจุบัน

วากยสัมพันธ์

DROP INDEX IF EXISTS KeyspaceName.IndexName;

ตัวอย่าง

นี่คือภาพรวมของคำสั่งที่ดำเนินการ 'Drop index' ซึ่งจะปล่อยดัชนี DeptIndex

Cassandra วางดัชนี

DROP INDEX IF EXISTS University.DeptIndex;

หลังจากดำเนินการคำสั่งสำเร็จ DeptIndex จะถูกละทิ้งจากคีย์สเปซ ขณะนี้ข้อมูลไม่สามารถกรองโดยแผนกคอลัมน์ได้

เพื่อยืนยันว่ามีดัชนีใดบ้างก่อนที่จะลบออกping หนึ่ง อธิบายตารางและอ่านคำจำกัดความของดัชนีที่ด้านล่างของผลลัพธ์

DESCRIBE TABLE University.Student;

ประเภทของดัชนีใน Cassandra

คำสั่งข้างต้นสร้างดัชนีรองมาตรฐาน แต่มีกลไกที่แตกต่างกันสามแบบ และแต่ละแบบมีพฤติกรรมที่แตกต่างกันมาก

ประเภท วิธีการทำงาน เหมาะสำหรับ
ดัชนีรอง แต่ละโหนดจะจัดทำดัชนีเฉพาะข้อมูลภายในเครื่องของตนเองเท่านั้น ดังนั้นการค้นหาข้อมูลโดยไม่มีคีย์พาร์ติชันจะต้องติดต่อทุกโหนด คอลัมน์ที่มีจำนวนข้อมูลปานกลางจะถูกสอบถามควบคู่ไปกับคีย์พาร์ติชัน
ดัชนี SASI ดัชนีที่แนบมานี้รองรับการจับคู่คำนำหน้าและคำต่อท้ายแบบ LIKE รวมถึงช่วงตัวเลขด้วย รูปแบบการค้นหาข้อความ ยังอยู่ในช่วงทดลอง ดังนั้นควรทดสอบก่อนนำไปใช้งานจริง
ดัชนีที่แนบมากับอุปกรณ์จัดเก็บข้อมูล (SAI) แนะนำใน Cassandra 5.0 ซึ่งใช้โครงสร้างดัชนีเดียวกันในทุกคอลัมน์ ส่งผลให้ค่าใช้จ่ายในการเขียนข้อมูลลดลง สิ่งทดแทนที่ทันสมัยสำหรับทั้งสองอย่างข้างต้นบน Cassandra 5 กลุ่ม

การสร้างดัชนีให้กับคอลัมน์ในชุดข้อมูลจะใช้ตัวดัดแปลงที่ระบุส่วนที่จะสร้างดัชนี

CREATE INDEX ON University.Teacher (VALUES(Email));
CREATE INDEX ON University.Course (KEYS(prereq));
CREATE INDEX ON University.Course (ENTRIES(prereq));

คำสั่ง VALUES ใช้ค้นหาองค์ประกอบของชุดข้อมูลหรือรายการ คำสั่ง KEYS ใช้ค้นหาคีย์ของแผนที่ และคำสั่ง ENTRIES ใช้จับคู่คีย์และค่าเข้าด้วยกัน การจัดทำดัชนีคอลเลกชันจะกล่าวถึงเพิ่มเติมในหัวข้อถัดไป Cassandra คอลเลกชัน เกี่ยวกับการสอน

เมื่อใดที่ไม่ควรใช้ดัชนีใน Cassandra

ดัชนีรองนั้นสะดวกก็จริง แต่ไม่ใช่ดัชนีเชิงสัมพันธ์ และการใช้ดัชนีรองในตำแหน่งที่ไม่เหมาะสมมักเป็นสาเหตุที่ทำให้คลัสเตอร์ทำงานช้า มีสี่สถานการณ์ที่ต้องใช้วิธีการที่แตกต่างออกไป

  • จำนวนสมาชิกที่สูงมาก การสร้างดัชนีให้กับสิ่งที่เกือบจะเป็นเอกลักษณ์ เช่น ที่อยู่อีเมล หมายความว่าเกือบทุกพาร์ติชันจะมีแถวที่ตรงกันอย่างน้อยหนึ่งแถว ดังนั้นการค้นหาจึงกระจายไปทั่วทั้งคลัสเตอร์เพื่อส่งคืนระเบียนเดียว
  • จำนวนสมาชิกน้อยมาก การสร้างดัชนีสำหรับแฟล็กสองค่า เช่น ใช้งานอยู่หรือไม่ใช้งาน จะทำให้เกิดพาร์ติชันดัชนีขนาดใหญ่มาก และการอ่านพาร์ติชันหนึ่งจะส่งคืนข้อมูลครึ่งหนึ่งของตาราง
  • คอลัมน์เหล่านี้มีการอัปเดตบ่อยครั้ง ทุกครั้งที่มีการเปลี่ยนแปลง ระบบจะสร้างรายการในดัชนีและสร้างหลุมฝังศพสำหรับรายการเก่า ซึ่งจะทำให้การสะสมของหลุมฝังศพส่งผลเสียต่อการอ่านข้อมูลเมื่อเวลาผ่านไป
  • แบบสอบถามที่ไม่มีคีย์พาร์ติชัน หากไม่มีตัวประสานงาน ผู้ประสานงานจะต้องติดต่อทุกโหนดและรวมผลลัพธ์เข้าด้วยกัน ซึ่งวิธีการนี้ไม่สามารถรองรับการขยายตัวเมื่อมีการเพิ่มโหนดมากขึ้น

ทางเลือกที่ยั่งยืนกว่าคือการสร้างตารางที่สองโดยใช้คอลัมน์ที่ต้องการค้นหาเป็นคีย์หลัก ซึ่งเขียนขึ้นพร้อมกับตารางแรก วิธีนี้เป็นไปตามหลักการ "ค้นหาก่อน" ที่อธิบายไว้ใน Cassandra กฎแบบจำลองข้อมูลและมันจะจำกัดการอ่านข้อมูลทั้งหมดไว้ในพาร์ติชันเดียวบนโหนดเดียวเท่านั้น

โดยทั่วไปแล้ว ดัชนีเหมาะสำหรับคอลัมน์ที่มีจำนวนข้อมูลปานกลางและถูกเรียกใช้ร่วมกับคีย์พาร์ติชันที่ทราบแล้ว หากข้อมูลไม่ตรงกับคำอธิบายนี้ ควรใช้ตารางที่สร้างขึ้นมาโดยเฉพาะจะเหมาะสมกว่า

คำถามที่พบบ่อย

ไม่มีข้อจำกัดที่ตายตัว แต่การสร้างดัชนีแต่ละตัวจะเพิ่มต้นทุนในการเขียนข้อมูลและใช้หน่วยความจำมากขึ้น จำนวนดัชนีสองหรือสามตัวต่อตารางถือเป็นจำนวนที่เหมาะสมที่สุด หากมากกว่านั้น ควรพิจารณาโมเดลข้อมูลใหม่แทน

ไม่ แถวที่มีอยู่จะถูกจัดทำดัชนีในเบื้องหลัง และตารางยังคงใช้งานได้ ตารางขนาดใหญ่ใช้เวลา และสามารถตรวจสอบความคืบหน้าได้ด้วยคำสั่ง nodetool compactionstats

ดัชนีจะชี้กลับไปยังแถวในตารางหลัก ส่วนมุมมองแบบ Materialized View คือตารางแยกต่างหากที่ได้รับการดูแลรักษาโดยอัตโนมัติ พร้อมด้วยคีย์พาร์ติชันของตัวเอง ดังนั้นการอ่านข้อมูลจากมุมมองนี้จะเข้าถึงพาร์ติชันเดียวเท่านั้น

เมื่อพิจารณาจากรายการคำค้นหาและจำนวนคอลัมน์ AI สามารถจัดอันดับผู้สมัครได้อย่างเหมาะสม แต่ AI ไม่สามารถพิจารณาความถี่ในการอัปเดต ซึ่งมักเป็นตัวตัดสินว่าดัชนีจะสะสมข้อมูลที่ถูกลบไปแล้วหรือไม่

บ่อยครั้งที่คำแนะนำนี้ทำให้การค้นหาที่ถูกปฏิเสธสามารถทำงานได้ ให้ถือว่าคำแนะนำนี้เป็นสัญญาณว่าจำเป็นต้องสร้างดัชนีหรือตารางค้นหาใหม่จริงๆ

สรุปโพสต์นี้ด้วย: