3 điểm bởi GN⁺ 2024-11-16 | 1 bình luận | Chia sẻ qua WhatsApp

Trực quan hóa chỉ mục SQLite: cấu trúc

  • Tầm quan trọng của chỉ mục: SQLite là một DBMS được sử dụng rộng rãi trong trình duyệt, ứng dụng di động và hệ điều hành, nên rất phù hợp để tìm hiểu cấu trúc chỉ mục và khám phá cách dữ liệu được lưu trữ trên đĩa và trong bộ nhớ.

Cấu trúc nút và trang

  • Cấu trúc B-tree: Chỉ mục của SQLite được lưu dưới dạng cấu trúc B-tree, trong đó mỗi nút có nhiều nút con.
  • Trang và ô: Trang lưu trữ dữ liệu ô và có liên kết tới trang con bên phải. Mỗi ô bao gồm dữ liệu chỉ mục, rowId và liên kết tới trang con bên trái.

Phân tích mã nguồn SQLite

  • Ví dụ mã: Viết hàm để phân tích chỉ mục. Ví dụ, hàm sqlite3DebugBtreeIndexDump sẽ đọc và in ra nội dung của chỉ mục được chọn.
  • Sử dụng Docker: Có thể dùng Docker để kiểm thử việc dump chỉ mục.

Trực quan hóa chỉ mục

  • Công cụ trực quan hóa: Đã thử dùng thư viện d3-org-tree để trực quan hóa cấu trúc chỉ mục, nhưng việc biểu diễn cấu trúc bằng văn bản lại đơn giản hơn.
  • PHP ImageMagick: Sử dụng phần mở rộng ImageMagick của PHP để tạo hình ảnh có thể kiểm soát thiết kế và khoảng cách.

Các ví dụ chỉ mục đa dạng

  • Chỉ mục cơ bản: Chỉ mục đơn giản gồm 1 bản ghi.
  • Số lượng bản ghi khác nhau: Chỉ mục có 1.000 và 1.000.000 bản ghi.
  • So sánh hướng sắp xếp: So sánh chỉ mục với hướng sắp xếp ASC và DESC.
  • Dữ liệu dựa trên biểu thức: Tạo chỉ mục bằng cách sử dụng biểu thức.
  • Chỉ mục duy nhất có chứa giá trị NULL: SQLite hỗ trợ chỉ mục duy nhất có giá trị NULL.
  • Chỉ mục một phần: Tạo chỉ mục bằng cách lọc các giá trị NULL.
  • Chỉ mục nhiều cột: Tạo chỉ mục bao gồm nhiều cột.

Tối ưu hóa chỉ mục

  • VACUUM và REINDEX: Các lệnh được dùng để tối ưu hóa chỉ mục hiện có.
  • Dữ liệu văn bản: Chuỗi ngắn được lưu trực tiếp trong ô chỉ mục, còn văn bản dài được lưu riêng.
  • Dữ liệu số thực dấu phẩy động: Tạo chỉ mục có chứa dữ liệu số thực dấu phẩy động.

Kết luận

  • Hiểu cấu trúc chỉ mục: Nắm được cấu trúc chỉ mục của SQLite và cách B-tree lưu trữ cũng như truy cập dữ liệu.
  • Tầm quan trọng của trực quan hóa: Nhờ trực quan hóa, có thể phân tích và so sánh nhiều loại chỉ mục khác nhau.
  • Kế hoạch sắp tới: Dự định tiếp tục trực quan hóa tìm kiếm dựa trên chỉ mục và khám phá các truy vấn SQL thú vị.

1 bình luận

 
GN⁺ 2024-11-16
Ý kiến trên Hacker News
  • Mỗi hàng trong bảng SQLite về cơ bản đều có một rowId duy nhất, và nếu không được định nghĩa tường minh thì nó hoạt động giống như khóa chính

    • Trên thực tế, ngay cả khi có khóa chính thì vẫn dùng rowId
    • Sẽ hay nếu trực quan hóa chỉ mục khóa chính của bảng WITHOUT ROWID
    • Hai chỉ mục trông có vẻ giống nhau, nhưng chỉ mục thứ hai với ít trang hơn có thể nhanh hơn
    • Ít nút hơn không nhất thiết đồng nghĩa với việc "nhanh" hơn
    • Điều quan trọng nhất là chiều cao của cây
    • Điều quan trọng thứ hai là điều gì xảy ra khi tìm thấy giá trị trong chỉ mục
    • Việc có phải tải phần còn lại từ một bảng riêng (rowid) hay dữ liệu đã có sẵn rồi (WITHOUT ROWID) là điều đặc biệt quan trọng, nhất là với truy vấn phạm vi
  • Tôi muốn xem cách hệ quản trị cơ sở dữ liệu (DBMS) lưu trữ và tra cứu chỉ mục trên đĩa và trong bộ nhớ

    • Tôi chọn SQLite làm đối tượng thử nghiệm
    • SQLite có một vài điểm khá khác thường trong cách nó xử lý mọi thứ
    • Điều này đặc biệt đúng trong xử lý truy vấn
    • SQLite có xu hướng ưu tiên sự đơn giản hơn hiệu năng nên được triển khai khác với các cơ sở dữ liệu khác
    • SQLite không cạnh tranh với các cơ sở dữ liệu khác
    • Nó cạnh tranh với các tệp JSON và XML cho mục đích lưu trữ bền vững
    • Điều này có nghĩa là cách SQLite triển khai bất cứ thứ gì gần như không cho biết cơ sở dữ liệu thực thụ hoạt động như thế nào
  • Trang web rất dễ đọc nên tôi muốn đọc

  • "indexes" được dùng vừa là hiện tại đơn ngôi thứ ba của động từ "to index", vừa là dạng số nhiều của danh từ "index"

    • Trong khi đó, "indices" là dạng số nhiều truyền thống, đặc biệt được dùng nhiều trong toán học và khoa học
    • Trong tiếng Anh thông thường, "indexes" được dùng phổ biến, nhưng trong lĩnh vực kỹ thuật, "indices" thường được ưa chuộng để giữ độ chính xác về mặt ngôn ngữ
    • Việc dùng "indices" giúp tăng độ rõ ràng bằng cách phân biệt giữa thao tác lập chỉ mục và dạng số nhiều của chỉ mục
  • Có lẽ sẽ hay nếu xem PostgreSQL thực hiện cùng việc đó như thế nào, rồi so sánh và ghi chú lại

  • Có thể tạo tgf cho yEd để có được nhiều kiểu bố cục hơn với ít công sức hơn