[PostgreSQL] Tại sao không phải lúc nào postgre cũng dùng index ?

Dạo gần đây tớ có đang tìm hiểu sâu hơn về PostgreSQL: các loại index, đọc hiểu explain, perfomance,…

Lúc đọc official doc ở trang chủ PostgreSQL thì thấy 2 ví dụ:

EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 7000;
                         QUERY PLAN
------------------------------------------------------------
 Seq Scan on tenk1  (cost=0.00..483.00 rows=7001 width=244)
   Filter: (unique1 < 7000)

EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100
                                  QUERY PLAN
------------------------------------------------------------------------------
 Bitmap Heap Scan on tenk1  (cost=5.07..229.20 rows=101 width=244)
   Recheck Cond: (unique1 < 100)
   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=101 width=0)
         Index Cond: (unique1 < 100)

Tớ mới thắc mắc rằng: 2 query này chỉ khác nhau về giá trị trong điều kiện where, vậy tại sao 1 thằng dùng index, 1 thằng lại không? Trong doc cũng nói nhưng chưa rõ lắm, nên tớ tìm hiểu ngoài mới hiểu thêm về nó.

Trả lời

  • Bản chất query theo index là dùng random access. Cost của random access tốn hơn sequense access 4 lần (1 random = 4 sequense)
  • Postgre không dùng index trong trường hợp số bản ghi của bạn > 10% số rows của bảng (chỗ này chưa hiểu tác giả móc đâu ra. Để mình tìm hiểu thêm rồi ghi nguồn vào)

Như vậy trong ví dụ trên, table tenk1 có khoảng 10k rows thì:

  • Scan 7000 row > 10% số rows => dùng seq scan cho khỏe
  • Scan 100 row < 10% số rows => dùng index cho thông minh.

Hết rồi

Trong bài tớ có tham khảo thêm bên throughbot: https://thoughtbot.com/blog/why-postgres-wont-always-use-an-index giải thích khá chi tiết. Anh em có thể vào đọc chơi.

Cảm ơn bạn vì đã đọc bài.

Chúc bạn một ngày làm việc hiệu quả ^^

Một suy nghĩ 1 thoughts on “[PostgreSQL] Tại sao không phải lúc nào postgre cũng dùng index ?

  1. Pingback: [TIL – PostgreSQL] Tăng tốc 50 lần cho PostgreSQL chỉ với 1 config nhỏ | minhphong306

Bình luận về bài viết này