ตัวอย่างราคา

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

เราขอแนะนำให้ใช้ฟีเจอร์ Query Explain เพื่อทำความเข้าใจค่าใช้จ่ายและประสิทธิภาพของการค้นหาที่เฉพาะเจาะจงได้ดียิ่งขึ้น

การดำเนินการอ่าน

การดำเนินการอ่านส่วนใหญ่เกี่ยวข้องกับการอ่านจุดของเอกสารที่เฉพาะเจาะจงหรือการสแกนช่วงข้อมูลตามตัวระบุ การดำเนินการอ่านจะใช้หน่วยอ่าน ดูตัวอย่างต่อไปนี้

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

ตารางต่อไปนี้แสดงค่าใช้จ่ายที่เกี่ยวข้องกับการดำเนินการค้นหาข้อความแบบเต็มสำหรับแคตตาล็อกผลิตภัณฑ์อีคอมเมิร์ซของเรือนเพาะชำ ตัวอย่างนี้สมมติว่ามีคอลเล็กชันข้อมูลสินค้าที่แสดง 200,000 รายการในคอลเล็กชัน โดยเอกสารข้อมูลสินค้าที่แสดงแต่ละรายการมีขนาด 2 KiB และดัชนีการค้นหาข้อความที่เกี่ยวข้องมีขนาดประมาณ 100 MiB

การค้นหา ตัวอย่างโค้ด หน่วยอ่านโดยประมาณที่ใช้ต่อการค้นหา ค่าใช้จ่ายโดยประมาณ (ภูมิภาค: us-central1 ในสกุลเงิน USD)
ค้นหาผลิตภัณฑ์ถาดแบนซ้อนกัน "น้ำแห้ง" ที่หายาก ซึ่งส่งผลให้มีการดึงข้อมูลเอกสาร 3 รายการ
db.products.find(
  {$text: {$search: '"dry water" stack flat'}}
);

หน่วยอ่านทั้งหมด 10 หน่วย

อิงตาม 7 หน่วยสำหรับการค้นหาข้อความแบบเต็มและอีก 3 หน่วยสำหรับเอกสารที่แสดง

$0.50 ต่อการค้นหา 1 ล้านครั้ง
ค้นหาต้นไม้ตระกูลส้มทั้งหมดที่ปลูกในบ้าน ซึ่งส่งผลให้มีการดึงข้อมูลเอกสาร 36 รายการ
db.products.find(
  {$text: {$search: '"indoor" "citrus" "tree"'}}
);

หน่วยอ่านทั้งหมด 42 หน่วย

อิงตาม 6 หน่วยสำหรับการค้นหาข้อความแบบเต็มและอีก 36 หน่วยสำหรับเอกสารที่แสดง

$2.10 ต่อการค้นหา 1 ล้านครั้ง
ค้นหากระถางต้นไม้สำหรับระเบียงที่มีผลการค้นหาผลิตภัณฑ์จำนวนมาก จัดเรียงผลการค้นหาตามความเกี่ยวข้อง และจำกัดผลการค้นหา 50 รายการแรก
db.products.find(
  {$text: {$search: 'balcony planter'}}
).sort({score: {$meta: "textScore"}}).limit(50);

หน่วยอ่านทั้งหมด 75 หน่วย

อิงตาม 25 หน่วยสำหรับการค้นหาข้อความแบบเต็มและอีก 50 หน่วยสำหรับเอกสารที่แสดง

$3.75 ต่อการค้นหา 1 ล้านครั้ง

ตัวอย่างเหล่านี้แสดงให้เห็นว่ารูปแบบการค้นหาที่แตกต่างกันส่งผลต่อค่าใช้จ่ายอย่างไร

  • การค้นหา"น้ำแห้ง" เกี่ยวข้องกับวลี ("dry water") และคำเพิ่มเติม การค้นหาวลีมีความซับซ้อนมากกว่าเนื่องจากเครื่องมือค้นหาต้องตรวจสอบความใกล้เคียงและลำดับของโทเค็น ซึ่งทำให้เกิดหน่วยอ่าน 7 หน่วยสำหรับระยะการค้นหา เนื่องจากมีเอกสารที่ตรงกันน้อยมาก ต้นทุนการดึงข้อมูลเอกสารจึงต่ำ
  • การค้นหา"ในบ้าน" "ส้ม" "ต้นไม้" จะค้นหาคำ 3 คำแยกกัน แม้ว่าจะมีความซับซ้อนน้อยกว่าการค้นหาวลีต่อคำ แต่ก็ยังต้องค้นหาโทเค็นหลายรายการ การค้นหานี้มีต้นทุนการสแกนดัชนีการค้นหาต่ำกว่าเล็กน้อยที่ 6 หน่วยอ่าน เมื่อเทียบกับตัวอย่าง "น้ำแห้ง" แต่ระบบจะแสดงเอกสาร 36 รายการ ซึ่งทำให้ต้นทุนรวมเพิ่มขึ้น
  • การค้นหากระถางต้นไม้สำหรับระเบียง มีต้นทุนการค้นหาข้อความแบบเต็มสูงสุดที่ 25 หน่วย ซึ่งสูงกว่าการค้นหาอื่นๆ อย่างมาก สาเหตุหลักเป็นเพราะการค้นหานี้ขอให้จัดเรียงผลการค้นหา ตามความเกี่ยวข้อง (.sort({score: {$meta: "textScore"}}) ) ในคำ ที่ตรงกับเอกสารจำนวนมาก เครื่องมือค้นหาต้องค้นหาผลการค้นหาที่เป็นไปได้ ทั้งหมด สำหรับ "ระเบียง" หรือ "กระถางต้นไม้" คำนวณคะแนนความเกี่ยวข้องสำหรับแต่ละรายการ แล้วจัดเรียงผลการค้นหาเหล่านั้นเพื่อกำหนดผลการค้นหา 50 รายการแรกที่เกี่ยวข้องมากที่สุด กระบวนการให้คะแนนและการจัดเรียงนี้ในผู้สมัครจำนวนมากภายในดัชนีต้องใช้การคำนวณจำนวนมาก แม้ว่าสุดท้ายแล้วจะมีการดึงข้อมูลเอกสารเพียง 50 รายการก็ตาม ความกว้างของคำรวมกับค่าใช้จ่ายในการให้คะแนนความเกี่ยวข้องทำให้ระยะการค้นหามีค่าใช้จ่ายสูงขึ้น

การค้นหาภูมิสารสนเทศ

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

ตารางต่อไปนี้แสดงค่าใช้จ่ายที่เกี่ยวข้องกับการดำเนินการค้นหาภูมิสารสนเทศสำหรับแอปพลิเคชันแผนที่ ตัวอย่างนี้สมมติว่ามีคอลเล็กชันเอกสาร 1,000,000 รายการที่แสดงถึงจุดที่น่าสนใจ โดยเอกสารจุดที่น่าสนใจแต่ละรายการมีขนาด 1 KiB และดัชนีภูมิสารสนเทศที่เกี่ยวข้องมีขนาดประมาณ 60 MiB

การค้นหา ตัวอย่างโค้ด หน่วยอ่านโดยประมาณที่ใช้ต่อการค้นหา ค่าใช้จ่ายโดยประมาณ (ภูมิภาค: us-central1 ในสกุลเงิน USD)
ค้นหาจุดสนใจทั้งหมดในรัศมีไม่เกิน 10 กม. โดยแสดงผลการค้นหา 10 รายการ
db.pois.find(
  {location: {
    $near: {
      $geometry: <point>,
      $maxDistance: 10000
    }}})

หน่วยอ่านทั้งหมด 16 หน่วย

อิงตามหน่วยอ่าน 6 หน่วยสำหรับการค้นหาภูมิสารสนเทศและอีก 10 หน่วยสำหรับเอกสารที่แสดง

$0.80 ต่อการค้นหา 1 ล้านครั้ง
ค้นหาจุดสนใจทั้งหมดที่มีระยะทางไม่เกิน 100 กม. และแสดงจุดสนใจ 10 รายการแรกที่อยู่ใกล้ที่สุดจากผลการค้นหา 1,000 รายการ
db.pois.find(
  {location: {
    $near: {
      $geometry: <point>,
      $maxDistance: 100000
    }}}).limit(10)

หน่วยอ่านทั้งหมด 19 หน่วย

อิงตามหน่วยอ่าน 9 หน่วยสำหรับการค้นหาภูมิสารสนเทศและอีก 10 หน่วยสำหรับเอกสารที่แสดง

$0.95 ต่อการค้นหา 1 ล้านครั้ง

ตัวอย่างเหล่านี้แสดงให้เห็นว่ารูปแบบการค้นหาที่แตกต่างกันส่งผลต่อค่าใช้จ่ายอย่างไร

  • การค้นหารัศมี 10 กม.: การค้นหานี้จะสแกนพื้นที่ทางภูมิศาสตร์ที่เล็กลง เนื่องจากพบผลการค้นหาเพียง 10 รายการภายในรัศมี 10 กม. นี้ เครื่องมือค้นหาจึงต้องทำงานน้อยลงในการระบุและจัดลำดับจุดเหล่านี้ตามระยะทาง (เนื่องจาก $near จะดำเนินการโดยนัย) ซึ่งส่งผลให้ต้นทุนการสแกนดัชนีต่ำลงที่ 6 หน่วยอ่าน
  • การค้นหารัศมี 100 กม.: การค้นหานี้ครอบคลุมพื้นที่ที่กว้างกว่ามาก การค้นหาพบผลการค้นหาที่เป็นไปได้ 1,000 รายการภายในรัศมี 100 กม. เครื่องมือค้นหาต้องคำนวณระยะทางและจัดเรียงชุดผู้สมัครจำนวนมาก (สูงสุด 1,000 จุด) ภายในดัชนีเพื่อดำเนินการตามคำขอสำหรับจุด 10 จุดที่อยู่ใกล้ที่สุด การทำงานด้านการคำนวณเพิ่มเติมในการกรองและจัดอันดับจุดจำนวนมากขึ้นนี้เองที่ทำให้ต้นทุนการค้นหาภูมิสารสนเทศสูงขึ้นที่ 9 หน่วยอ่าน เมื่อเทียบกับการค้นหารัศมี 10 กม. แม้ว่าจะแสดงเอกสารเพียง 10 รายการเช่นกัน

การอ่านจุด

ตัวอย่างการเรียกเก็บเงินสำหรับการอ่านจุด

  • การอ่านจุดของเอกสารเดียวขนาด 1 KiB ใช้หน่วยอ่าน 1 หน่วย
  • การอ่านจุดของเอกสารเดียวขนาด 4 KiB ใช้หน่วยอ่าน 1 หน่วย
  • การอ่านจุดของเอกสารเดียวขนาด 1 MiB ใช้หน่วยอ่าน 256 หน่วย
  • การอ่านจุดของเอกสาร 100 รายการ ขนาด 1 KiB ต่อรายการ ใช้หน่วยอ่าน 100 หน่วย

การสแกน

ตัวอย่างต่อไปนี้รวมถึงสถานการณ์ที่สแกนเอกสารหรือรายการดัชนี

การสแกนเอกสาร

  • การค้นหาที่สแกนเอกสาร 100 รายการ ขนาด 1 KiB ต่อรายการ ใช้หน่วยอ่าน 25 หน่วย

การสแกนดัชนี

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

  • การค้นหาที่สแกนรายการดัชนี 100 รายการ ขนาด 1 KiB ต่อรายการ ใช้หน่วยอ่าน 25 หน่วย
  • การค้นหาที่สแกนรายการดัชนี 100 รายการ ขนาด 128 ไบต์ต่อรายการ ใช้หน่วยอ่าน 4 หน่วย

ขนาดเอกสารหรือรายการดัชนีขั้นต่ำ

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

  • นับจำนวนเอกสารในคอลเล็กชัน การค้นหาสแกนรายการ 1,000 รายการในคอลเล็กชัน ใช้หน่วยอ่าน 8 หน่วย

การสแกนและการอ่านจุดร่วมกัน

การค้นหาจำนวนมากจะดำเนินการสแกนและการอ่านจุดร่วมกันเพื่อให้การดำเนินการสำเร็จ

  • การค้นหาที่สแกนรายการดัชนี 128 รายการ ขนาด 256 ไบต์ต่อรายการ และดำเนินการอ่านจุดของเอกสาร 128 รายการ ขนาด 4 KiB ต่อรายการ ใช้หน่วยอ่าน 136 หน่วย ซึ่งประกอบด้วย
    • หน่วยอ่าน 128 หน่วยสำหรับการอ่านจุด
    • หน่วยอ่าน 8 หน่วยสำหรับการสแกนดัชนี

Query Explain

Query Explain ช่วยให้คุณเข้าใจวิธีที่ฐานข้อมูล ดำเนินการค้นหา รายละเอียดที่แสดงจะช่วยให้คุณเพิ่มประสิทธิภาพการค้นหาได้

ค่าใช้จ่ายต่อไปนี้จะมีผลเมื่อใช้ Query Explain

  • Query Explain ที่ดำเนินการค้นหา: มีค่าใช้จ่ายในการค้นหา
  • Query Explain ที่ใช้ตัวเลือกแผนเท่านั้น ใช้หน่วยอ่าน 1 หน่วย (ค่าใช้จ่ายขั้นต่ำของการค้นหา)

การดำเนินการเขียน

ระบบจะเรียกเก็บเงินสำหรับการดำเนินการเขียน (สร้าง อัปเดต และลบ) ตามขนาดของเอกสารและดัชนีที่สร้าง แก้ไข หรือลบระหว่างการดำเนินการ การดำเนินการเขียนจะใช้หน่วยเขียน ระบบจะคำนวณหน่วยเขียนเป็นส่วนๆ ขนาด 1 KiB

การดำเนินการเขียนอย่างง่าย เช่น การอัปเดตตามรหัสเอกสาร จะมีค่าใช้จ่ายเฉพาะการเขียนเท่านั้น การดำเนินการเขียนที่ต้องมีการค้นหาเพื่อให้การดำเนินการสำเร็จจะมีค่าใช้จ่ายในการอ่านเพิ่มเติมที่เกี่ยวข้องกับการค้นหา

ดูตัวอย่างต่อไปนี้

การสร้าง

  • สร้างเอกสารใหม่ขนาด 10 KiB ที่ไม่มีดัชนี ใช้หน่วยเขียน 10 หน่วย
  • สร้างเอกสารขนาด 1 KiB ที่มีรายการดัชนี 1 รายการขนาด 256 ไบต์ในคอลเล็กชัน ใช้หน่วยเขียน 2 หน่วย

การอัปเดต

  • ค้นหาเอกสารขนาด 10 KiB ตามรหัสเอกสารและอัปเดตโดยไม่มีดัชนีในคอลเล็กชัน ใช้หน่วยเขียน 10 หน่วย
  • ค้นหาเอกสารขนาด 1 KiB ตามรหัสเอกสารและอัปเดต 1 ช่องที่มีรายการดัชนี 1 รายการขนาด 256 ไบต์ ใช้หน่วยเขียน 3 หน่วย หมายเหตุ: การอัปเดตรายการดัชนีในสถานการณ์นี้จะใช้หน่วยเขียน 2 หน่วย ซึ่งหน่วยหนึ่งใช้ลบและอีกหน่วยหนึ่งใช้สร้างรายการดัชนีใหม่
  • ค้นหาเอกสารขนาด 1 KiB ตามรหัสเอกสารและไม่อัปเดตอะไรเลย (ไม่มีการเปลี่ยนแปลง) ใช้หน่วยเขียน 1 หน่วย (ค่าใช้จ่ายขั้นต่ำในการเขียน)
  • ค้นหาเอกสารทั้งหมดขนาด 1 KiB ในคอลเล็กชัน ซึ่งสแกนเอกสาร 1, 000 รายการ และแทรกช่องใหม่ขนาด 256 ไบต์ที่ไม่มีดัชนีในคอลเล็กชัน: หน่วยอ่าน 1,000 หน่วยและหน่วยเขียน 1, 000 หน่วย

การลบ

  • ลบเอกสารขนาด 1 KiB ที่มีดัชนี 1 รายการในคอลเล็กชัน ใช้หน่วยเขียน 2 หน่วย
  • ลบเอกสารขนาด 1 KiB ที่ไม่มีดัชนีในคอลเล็กชัน ใช้หน่วยเขียน 1 หน่วย

การสร้างดัชนี

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

  • สร้างดัชนีใหม่สำหรับคอลเล็กชันที่มีเอกสาร 500 รายการ โดยรายการดัชนีที่สร้างมีขนาด 1 KiB ต่อรายการ ใช้หน่วยเขียน 500 หน่วย
  • ลบดัชนีที่มีอยู่ออกจากคอลเล็กชันที่มีเอกสาร 500 รายการ โดยรายการดัชนีที่ลบมีขนาด 1 KiB ต่อรายการ ใช้หน่วยเขียน 500 หน่วย