3 คะแนน โดย GN⁺ 2024-11-16 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

การแสดงภาพดัชนีของ SQLite: โครงสร้าง

  • ความสำคัญของดัชนี: SQLite เป็น DBMS ที่ถูกใช้อย่างแพร่หลายในเบราว์เซอร์ แอปมือถือ และระบบปฏิบัติการ จึงเหมาะสำหรับการทำความเข้าใจโครงสร้างดัชนีและสำรวจวิธีการจัดเก็บทั้งบนดิสก์และในหน่วยความจำ

โครงสร้างโหนดและเพจ

  • โครงสร้าง B-tree: ดัชนีของ SQLite ถูกจัดเก็บในรูปแบบโครงสร้าง B-tree โดยแต่ละโหนดมีโหนดย่อยได้หลายตัว
  • เพจและเซลล์: เพจใช้เก็บข้อมูลเซลล์และมีลิงก์ไปยังเพจลูกด้านขวา ส่วนเซลล์ประกอบด้วยข้อมูลดัชนี, rowId และลิงก์ไปยังเพจลูกด้านซ้าย

การวิเคราะห์ซอร์สโค้ดของ SQLite

  • ตัวอย่างโค้ด: มีการเขียนฟังก์ชันเพื่อวิเคราะห์ดัชนี ตัวอย่างเช่น ฟังก์ชัน sqlite3DebugBtreeIndexDump จะอ่านและแสดงผลเนื้อหาของดัชนีที่เลือก
  • การใช้ Docker: สามารถใช้ Docker เพื่อทดสอบการดัมป์ดัชนีได้

การแสดงภาพดัชนี

  • เครื่องมือแสดงภาพ: มีการพยายามใช้ไลบรารี d3-org-tree เพื่อแสดงภาพโครงสร้างดัชนี แต่การแสดงโครงสร้างเป็นข้อความกลับง่ายกว่า
  • PHP ImageMagick: ใช้ส่วนขยาย ImageMagick ของ PHP เพื่อสร้างภาพที่ควบคุมการออกแบบและระยะห่างได้

ตัวอย่างดัชนีหลากหลายแบบ

  • ดัชนีพื้นฐาน: ดัชนีแบบเรียบง่ายที่ประกอบด้วย 1 เรคอร์ด
  • จำนวนเรคอร์ดที่หลากหลาย: ดัชนีที่มี 1,000 และ 1,000,000 เรคอร์ด
  • เปรียบเทียบทิศทางการจัดเรียง: เปรียบเทียบดัชนีที่จัดเรียงแบบ ASC และ DESC
  • ข้อมูลที่อิงจากนิพจน์: สร้างดัชนีโดยใช้นิพจน์
  • ดัชนีเอกลักษณ์ที่มีค่า NULL: SQLite รองรับดัชนีเอกลักษณ์ที่มีค่า NULL
  • ดัชนีบางส่วน: สร้างดัชนีโดยกรองค่า NULL ออก
  • ดัชนีหลายคอลัมน์: สร้างดัชนีที่มีหลายคอลัมน์

การปรับแต่งดัชนีให้เหมาะสม

  • VACUUM และ REINDEX: คำสั่งที่ใช้เพื่อปรับแต่งดัชนีเดิมให้เหมาะสม
  • ข้อมูลข้อความ: สตริงสั้นจะถูกเก็บไว้ในเซลล์ดัชนีโดยตรง ส่วนข้อความยาวจะถูกเก็บแยกต่างหาก
  • ข้อมูลทศนิยมลอยตัว: สร้างดัชนีที่มีข้อมูลทศนิยมลอยตัว

บทสรุป

  • การเข้าใจโครงสร้างดัชนี: ทำความเข้าใจโครงสร้างดัชนีของ SQLite และวิธีที่ B-tree ใช้จัดเก็บและเข้าถึงข้อมูล
  • ความสำคัญของการแสดงภาพ: การแสดงภาพช่วยให้วิเคราะห์และเปรียบเทียบดัชนีหลากหลายแบบได้
  • แผนในอนาคต: มีแผนจะแสดงภาพการค้นหาที่อิงดัชนี และสำรวจ SQL query ที่น่าสนใจเพิ่มเติม

1 ความคิดเห็น

 
GN⁺ 2024-11-16
ความคิดเห็นจาก Hacker News
  • แต่ละแถวของตาราง SQLite โดยพื้นฐานแล้วจะมี rowId ที่ไม่ซ้ำกัน ซึ่งทำงานเหมือนคีย์หลักหากไม่ได้กำหนดไว้อย่างชัดเจน

    • ในทางปฏิบัติ แม้จะมีคีย์หลักอยู่ก็ยังใช้ rowId
    • น่าจะลองทำภาพแสดงดัชนีคีย์หลักของตาราง WITHOUT ROWID
    • ดัชนีทั้งสองดูคล้ายกัน แต่ดัชนีตัวที่สองที่มีจำนวนเพจน้อยกว่าอาจเร็วกว่า
    • การมีจำนวนโหนดน้อยกว่าไม่ได้แปลว่า "เร็วกว่า" เสมอไป
    • สิ่งสำคัญที่สุดคือความสูงของต้นไม้
    • สิ่งที่สำคัญรองลงมาคือสิ่งที่เกิดขึ้นเมื่อพบค่าในดัชนี
    • ต้องไปโหลดส่วนที่เหลือจากตารางแยกต่างหาก (rowid) หรือมีข้อมูลอยู่แล้ว (WITHOUT ROWID) ซึ่งสำคัญอย่างยิ่งโดยเฉพาะกับ range query
  • อยากเห็นว่าระบบจัดการฐานข้อมูล (DBMS) จัดเก็บและค้นคืนดัชนีจากดิสก์และหน่วยความจำอย่างไร

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

  • indexes ใช้ได้ทั้งเป็นรูปกริยาปัจจุบันเอกพจน์บุรุษที่สามของ to index และเป็นรูปพหูพจน์ของคำนาม index

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

  • สามารถสร้าง tgf สำหรับ yEd เพื่อให้ได้เลย์เอาต์ที่หลากหลายขึ้นด้วยงานที่น้อยลง