PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tổng quan về khả năng JSON trong PostgreSQL

JSON là gì?

JSON là viết tắt của “JavaScript Object Notation”, là một loại định dạng dữ liệu được các ứng dụng web sử dụng phổ biến. Điều này có nghĩa là, dữ liệu sẽ được truyền giữa các ứng dụng web và máy chủ ở định dạng như vậy. JSON đã được giới thiệu như một sự thay thế cho định dạng XML. Trong “những ngày xưa tốt đẹp”, dữ liệu được sử dụng để truyền ở định dạng XML, đây là kiểu dữ liệu có trọng lượng lớn so với JSON. Dưới đây là ví dụ về chuỗi có định dạng JSON:

{ "ID":"001","name": "Ven", "Country": "Australia",  "city": "Sydney", "Job Title":"Database Consultant"}

Một chuỗi JSON có thể chứa một đối tượng JSON khác với chính nó như được hiển thị bên dưới:

{ "ID":"001", "name": "Ven", "Job Title":"Database Consultant", "Location":{"Suburb":"Dee Why","city": "Sydney","State":"NSW","Country": "Australia"}}

Các ứng dụng web và thiết bị di động hiện đại hầu hết tạo ra dữ liệu ở định dạng JSON, còn được gọi là “JSON Byte” được các máy chủ ứng dụng chọn và được gửi đến cơ sở dữ liệu. Các byte JSON lần lượt được xử lý, chia nhỏ thành các giá trị cột riêng biệt và được chèn vào bảng RDBMS.
Ví dụ:

{ "ID":"001","name": "Ven", "Country": "Australia",  "city": "Sydney", "Job Title":"Database Consultant"}

Dữ liệu JSON ở trên được chuyển đổi thành SQL như bên dưới ..

Insert into test (id, name, country,city,job_title) values  (001,'Ven','Australia','Sydney','Database Consultant');

Khi nói đến việc lưu trữ và xử lý dữ liệu JSON, có nhiều cơ sở dữ liệu NoSQL hỗ trợ nó và cơ sở dữ liệu phổ biến nhất là MongoDB. Khi nói đến cơ sở dữ liệu RDBMS, cho đến thời gian gần đây, các chuỗi JSON được coi là văn bản bình thường và không có kiểu dữ liệu nào nhận dạng, lưu trữ hoặc xử lý các chuỗi định dạng JSON một cách cụ thể. PostgreSQL, cơ sở dữ liệu RDBMS nguồn mở phổ biến nhất đã đưa ra kiểu dữ liệu JSON, loại dữ liệu này có lợi cho hiệu suất, chức năng và khả năng mở rộng khi xử lý dữ liệu JSON.

PostgreSQL + JSON

Cơ sở dữ liệu PostgreSQL ngày càng trở nên phổ biến hơn kể từ khi kiểu dữ liệu JSON được giới thiệu. Trên thực tế, PostgreSQL đã vượt trội hơn MongoDB khi xử lý một lượng lớn dữ liệu JSON. Các ứng dụng có thể lưu trữ các chuỗi JSON trong cơ sở dữ liệu PostgreSQL ở định dạng JSON tiêu chuẩn. Các nhà phát triển chỉ cần yêu cầu ứng dụng gửi các chuỗi JSON đến cơ sở dữ liệu dưới dạng dữ liệu kiểu json và truy xuất lại ở định dạng JSON. Lưu trữ chuỗi JSON trong kiểu dữ liệu JSON có một số ưu điểm so với việc lưu trữ cùng một kiểu dữ liệu TEXT. Kiểu dữ liệu JSON chỉ có thể chấp nhận các chuỗi được định dạng JSON hợp lệ, nếu chuỗi không ở định dạng JSON chính xác, lỗi sẽ được tạo ra. Kiểu dữ liệu JSON giúp ứng dụng thực hiện các tìm kiếm hiệu quả và dựa trên Chỉ mục, chúng ta sẽ xem chi tiết ngay sau đây.

Kiểu dữ liệu JSON đã được giới thiệu trong bài đăng PostgreSQL-9.2, những cải tiến đáng kể đã được thực hiện. Sự bổ sung chính xuất hiện trong PostgreSQL-9.4 với việc bổ sung kiểu dữ liệu JSONB. JSONB là phiên bản nâng cao của kiểu dữ liệu JSON lưu trữ dữ liệu JSON ở định dạng nhị phân. Đây là cải tiến lớn tạo ra sự khác biệt lớn đối với cách dữ liệu JSON được tìm kiếm và xử lý trong PostgreSQL. Hãy để chúng tôi có một cái nhìn chi tiết về các ưu điểm của kiểu dữ liệu JSON.

Các kiểu dữ liệu JSON và JSONB

Kiểu dữ liệu JSON lưu trữ các chuỗi được định dạng json dưới dạng văn bản không mạnh mẽ lắm và không hỗ trợ nhiều hàm liên quan đến JSON được sử dụng để tìm kiếm. Nó chỉ hỗ trợ lập chỉ mục B-TREE truyền thống và không hỗ trợ các loại Chỉ mục khác bắt buộc phải có cho các hoạt động tìm kiếm nhanh hơn và hiệu quả trên dữ liệu JSON.

JSONB, phiên bản nâng cao của kiểu dữ liệu JSON, rất được khuyến khích để lưu trữ và xử lý tài liệu JSON. Nó hỗ trợ một loạt các toán tử json và có nhiều lợi thế hơn JSON, như lưu trữ các chuỗi được định dạng JSON ở định dạng nhị phân và hỗ trợ các hàm JSON và lập chỉ mục, để thực hiện các tìm kiếm hiệu quả.

Hãy để chúng tôi xem xét sự khác biệt.

JSON JSONB
1 Khá giống kiểu dữ liệu TEXT chỉ lưu trữ tài liệu JSON hợp lệ. Lưu trữ các tài liệu JSON ở định dạng Binary.
2 Lưu trữ các tài liệu JSON nguyên trạng bao gồm cả khoảng trắng. Cắt bớt khoảng trắng và lưu trữ ở định dạng có lợi cho việc tìm kiếm nhanh hơn và hiệu quả
3 Không hỗ trợ lập chỉ mục FULL-TEXT-SEARCH Hỗ trợ lập chỉ mục FULL-TEXT-SEARCH
4 Không hỗ trợ nhiều hàm và toán tử JSON Hỗ trợ tất cả các hàm và toán tử JSON

Ví dụ cho # 4 Được liệt kê ở trên

JSON

Dưới đây là bảng có kiểu dữ liệu JSON

dbt3=# \d product
                   Table "dbt3.product"
     Column     |  Type  | Collation | Nullable | Default
----------------+--------+-----------+----------+---------
 item_code      | bigint |           | not null |
 productdetails | json   |           |          |
Indexes:
    "product_pkey" PRIMARY KEY, btree (item_code)

Không hỗ trợ toán tử JSON truyền thống (như “@>” hoặc “#>”). Tìm kiếm toàn văn bản thông qua dữ liệu JSON được thực hiện bằng cách sử dụng “@>” hoặc “#>” trong SQL không được hỗ trợ bởi kiểu dữ liệu JSON

dbt3=# select * from product where productdetails @> '{"l_shipmode":"AIR"}' and productdetails @> '{"l_quantity":"27"}';
ERROR:  operator does not exist: json @> unknown
LINE 1: select * from product where productdetails @> '{"l_shipmode"...
                                                   ^
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.
dbt3=#

JSONB

Dưới đây là bảng có kiểu dữ liệu JSONB

dbt3=# \d products
                  Table "dbt3.products"
    Column     |  Type  | Collation | Nullable | Default
---------------+--------+-----------+----------+---------
 item_code     | bigint |           | not null |
 order_details | jsonb  |           |          |
Indexes:
    "products_pkey" PRIMARY KEY, btree (item_code)

Hỗ trợ TÌM KIẾM ĐẦY ĐỦ thông qua dữ liệu JSON bằng cách sử dụng toán tử (như “@>”)

dbt3=# select * from products where order_details @> '{"l_shipmode" : "AIR"}' limit 2;
 item_code |                                                                                        order_details
-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
         4 | {"l_partkey": 21315, "l_orderkey": 1, "l_quantity": 28, "l_shipdate": "1996-04-21", "l_shipmode": "AIR", "l_commitdate": "1996-03-30", "l_shipinstruct": "NONE", "l_extendedprice": 34616.7}
         8 | {"l_partkey": 42970, "l_orderkey": 3, "l_quantity": 45, "l_shipdate": "1994-02-02", "l_shipmode": "AIR", "l_commitdate": "1994-01-04", "l_shipinstruct": "NONE", "l_extendedprice": 86083.6}
(2 rows)
Tải xuống Báo cáo chính thức hôm nay Quản lý &Tự động hóa PostgreSQL với ClusterControlTìm hiểu về những điều bạn cần biết để triển khai, giám sát, quản lý và mở rộng PostgreSQLTải xuống Báo cáo chính thức

Cách truy vấn dữ liệu JSON

Hãy để chúng tôi xem xét một số khả năng của PostgreSQL JSON liên quan đến hoạt động dữ liệu Dưới đây là cách dữ liệu JSON trông như thế nào trong một Bảng. Cột “order_details” thuộc loại JSONB

dbt3=# select * from product_details ;
 item_code |                                                                                                 order_details
-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
         1 | {"l_partkey": 1551894, "l_orderkey": 1, "l_quantity": 17, "l_shipdate": "1996-03-13", "l_shipmode": "TRUCK", "l_commitdate": "1996-02-12", "l_shipinstruct": "DELIVER IN PERSON", "l_extendedprice": 33078.9}
         2 | {"l_partkey": 673091, "l_orderkey": 1, "l_quantity": 36, "l_shipdate": "1996-04-12", "l_shipmode": "MAIL", "l_commitdate": "1996-02-28", "l_shipinstruct": "TAKE BACK RETURN", "l_extendedprice": 38306.2}
         3 | {"l_partkey": 636998, "l_orderkey": 1, "l_quantity": 8, "l_shipdate": "1996-01-29", "l_shipmode": "REG AIR", "l_commitdate": "1996-03-05", "l_shipinstruct": "TAKE BACK RETURN", "l_extendedprice": 15479.7}
         4 | {"l_partkey": 21315, "l_orderkey": 1, "l_quantity": 28, "l_shipdate": "1996-04-21", "l_shipmode": "AIR", "l_commitdate": "1996-03-30", "l_shipinstruct": "NONE", "l_extendedprice": 34616.7}
         5 | {"l_partkey": 240267, "l_orderkey": 1, "l_quantity": 24, "l_shipdate": "1996-03-30", "l_shipmode": "FOB", "l_commitdate": "1996-03-14", "l_shipinstruct": "NONE", "l_extendedprice": 28974}
         6 | {"l_partkey": 156345, "l_orderkey": 1, "l_quantity": 32, "l_shipdate": "1996-01-30", "l_shipmode": "MAIL", "l_commitdate": "1996-02-07", "l_shipinstruct": "DELIVER IN PERSON", "l_extendedprice": 44842.9}
         7 | {"l_partkey": 1061698, "l_orderkey": 2, "l_quantity": 38, "l_shipdate": "1997-01-28", "l_shipmode": "RAIL", "l_commitdate": "1997-01-14", "l_shipinstruct": "TAKE BACK RETURN", "l_extendedprice": 63066.3}
         8 | {"l_partkey": 42970, "l_orderkey": 3, "l_quantity": 45, "l_shipdate": "1994-02-02", "l_shipmode": "AIR", "l_commitdate": "1994-01-04", "l_shipinstruct": "NONE", "l_extendedprice": 86083.6}
         9 | {"l_partkey": 190355, "l_orderkey": 3, "l_quantity": 49, "l_shipdate": "1993-11-09", "l_shipmode": "RAIL", "l_commitdate": "1993-12-20", "l_shipinstruct": "TAKE BACK RETURN", "l_extendedprice": 70822.1}
        10 | {"l_partkey": 1284483, "l_orderkey": 3, "l_quantity": 27, "l_shipdate": "1994-01-16", "l_shipmode": "SHIP", "l_commitdate": "1993-11-22", "l_shipinstruct": "DELIVER IN PERSON", "l_extendedprice": 39620.3}
(10 rows)

Chọn tất cả các mã hàng bao gồm cả ngày giao hàng của chúng

dbt3=# select item_code, order_details->'l_shipdate' as shipment_date from product_details ;

 item_code | shipment_date
-----------+---------------
         1 | "1996-03-13"
         2 | "1996-04-12"
         3 | "1996-01-29"
         4 | "1996-04-21"
         5 | "1996-03-30"
         6 | "1996-01-30"
         7 | "1997-01-28"
         8 | "1994-02-02"
         9 | "1993-11-09"
        10 | "1994-01-16"
(10 rows)

Nhận mã hàng, số lượng và giá của tất cả các đơn hàng đến bằng đường hàng không

dbt3=# select item_code, order_details->'l_quantity' as quantity, order_details->'l_extendedprice' as price, order_details->'l_shipmode' as price from product_details where order_details->>'l_shipmode'='AIR';

 item_code | quantity |  price  | price
-----------+----------+---------+-------
         4 | 28       | 34616.7 | "AIR"
         8 | 45       | 86083.6 | "AIR"
(2 rows)

Các toán tử JSON “->” và “->>” được sử dụng để lựa chọn và so sánh trong truy vấn SQL. Toán tử “->” trả về trường Đối tượng JSON dưới dạng một trường trong dấu ngoặc kép và toán tử “->>” trả về trường đối tượng JSON dưới dạng TEXT. Hai SQL trên là ví dụ về việc hiển thị các giá trị trường JSON nguyên trạng. Dưới đây là ví dụ về việc trích xuất trường JSON ở dạng TEXT.
Dưới đây là ví dụ về cách tìm nạp trường JSON ở dạng TEXT

dbt3=# select item_code, order_details->>'l_shipdate' as shipment_date from product_details ;
 item_code | shipment_date
-----------+---------------
         1 | 1996-03-13
         2 | 1996-04-12
         3 | 1996-01-29
         4 | 1996-04-21
         5 | 1996-03-30
         6 | 1996-01-30
         7 | 1997-01-28
         8 | 1994-02-02
         9 | 1993-11-09
        10 | 1994-01-16
(10 rows)

Có một toán tử khác được gọi là “#>” được sử dụng để truy vấn phần dữ liệu của Phần tử JSON, lần lượt là một phần của chuỗi JSON. Chúng ta hãy xem một ví dụ.
Dưới đây là dữ liệu trong bảng.

dbt3=# select * from test_json ;
  id   |                                                                                                details
-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 10000 | {"Job": "Database Consultant", "name": "Venkata", "Location": {"city": "Sydney", "State": "NSW", "Suburb": "Dee Why", "Country": "Australia"}}
 20000 | {"Job": "Database Consultant", "name": "Smith", "Location": {"city": "Sydney", "State": "NSW", "Suburb": "Manly", "Country": "Australia"}}
 30000 | {"Job": "Developer", "name": "John", "Location": {"city": "Sydney", "State": "NSW", "Suburb": "Brookvale", "Country": "Australia"}}
 50000 | {"cars": {"Ford": [{"doors": 4, "model": "Taurus"}, {"doors": 4, "model": "Escort"}], "Nissan": [{"doors": 4, "model": "Sentra"}, {"doors": 4, "model": "Maxima"}, {"doors": 2, "model": "Skyline"}]}}
 40000 | {"Job": "Architect", "name": "James", "Location": {"city": "Melbourne", "State": "NSW", "Suburb": "Trugnania", "Country": "Australia"}}

Tôi muốn xem tất cả thông tin chi tiết với “State” “NSW” và “State” là khóa đối tượng JSON, là một phần của khóa “Location”. Dưới đây là cách truy vấn tương tự.

dbt3=# select * from test_json where details #> '{Location,State}'='"NSW"';
  id   |                                                                    details
-------+------------------------------------------------------------------------------------------------------------------------------------------------
 10000 | {"Job": "Database Consultant", "name": "Venkata", "Location": {"city": "Sydney", "State": "NSW", "Suburb": "Dee Why", "Country": "Australia"}}
 20000 | {"Job": "Database Consultant", "name": "Smith", "Location": {"city": "Sydney", "State": "NSW", "Suburb": "Manly", "Country": "Australia"}}
 30000 | {"Job": "Developer", "name": "John", "Location": {"city": "Sydney", "State": "NSW", "Suburb": "Brookvale", "Country": "Australia"}}
 30000 | {"Job": "Architect", "name": "James", "Location": {"city": "Melbourne", "State": "NSW", "Suburb": "Trugnania", "Country": "Australia"}}
(4 rows)

Các phép toán số học có thể được thực hiện trên dữ liệu JSON. Truyền kiểu là cần thiết vì phần dữ liệu của cột JSON là TEXT.

dbt3=# select item_code, order_details->'l_quantity' as quantity, order_details->'l_extendedprice' as price, order_details->'l_shipmode' as price from product_details where (order_details->'l_quantity')::int > 10;
 item_code | quantity |  price  |  price
-----------+----------+---------+---------
         1 | 17       | 33078.9 | "TRUCK"
         2 | 36       | 38306.2 | "MAIL"
         4 | 28       | 34616.7 | "AIR"
         5 | 24       | 28974   | "FOB"
         6 | 32       | 44842.9 | "MAIL"
         7 | 38       | 63066.3 | "RAIL"
         8 | 45       | 86083.6 | "AIR"
         9 | 49       | 70822.1 | "RAIL"
        10 | 27       | 39620.3 | "SHIP"
(9 rows)

Ngoài tất cả những điều trên, các hoạt động sau cũng có thể được thực hiện trên JSON bằng cách sử dụng SQL bao gồm cả JOIN

  1. Sắp xếp dữ liệu bằng mệnh đề ORDER BY
  2. Tổng hợp bằng cách sử dụng các hàm tổng hợp như SUM, AVG, MIN, MAX, v.v.
  3. Nhóm dữ liệu bằng mệnh đề GROUP BY

Làm thế nào về Hiệu suất?

Dữ liệu trong các cột JSON sẽ có bản chất là văn bản và dựa trên các vấn đề về hiệu suất kích thước dữ liệu có thể được mong đợi. Tìm kiếm thông qua dữ liệu JSON có thể mất thời gian và sức mạnh tính toán dẫn đến phản hồi chậm đối với (các) ứng dụng. Đối với các DBA, điều bắt buộc là phải đảm bảo các SQL chạm vào các cột JSON đang phản hồi đủ nhanh và hiển thị hiệu suất tốt. Vì việc trích xuất dữ liệu được thực hiện thông qua SQL, nên tùy chọn mà các DBA sẽ tìm kiếm là khả năng Lập chỉ mục và vâng, Các kiểu dữ liệu JSON hỗ trợ các tùy chọn Lập chỉ mục.

Hãy để chúng tôi xem xét các tùy chọn Lập chỉ mục mà JSON mang lại cho chúng tôi.

JSONB lập chỉ mục

Kiểu dữ liệu JSONB hỗ trợ Lập chỉ mục FULL-TEXT-SEARCH. Đây là khả năng quan trọng nhất của JSONB mà các DBA sẽ mong đợi khi sử dụng các kiểu dữ liệu JSONB. Chỉ mục bình thường trên khóa Đối tượng JSON có thể không hữu ích khi sử dụng các toán tử JSON cụ thể trong các truy vấn tìm kiếm.

dbt3=# explain select * from products where order_details @> '{"l_shipmode" : "AIR"}';
                             QUERY PLAN
--------------------------------------------------------------------
 Seq Scan on products  (cost=0.00..4205822.65 rows=59986 width=252)
   Filter: (order_details @> '{"l_shipmode": "AIR"}'::jsonb)
(2 rows)

JSONB hỗ trợ loại Chỉ mục FULL-TEXT-TÌM KIẾM được gọi là GIN giúp các truy vấn như trên.
Bây giờ, hãy để tôi tạo Chỉ mục GIN và xem điều đó có hữu ích không

dbt3=# create index od_gin_idx on products using gin(order_details jsonb_path_ops);
CREATE INDEX

Nếu bạn có thể quan sát bên dưới, truy vấn sẽ chọn Chỉ mục GIN

dbt3=# explain select * from products where order_details @> '{"l_shipmode" : "AIR"}';
                                  QUERY PLAN
-------------------------------------------------------------------------------
 Bitmap Heap Scan on products  (cost=576.89..215803.18 rows=59986 width=252)
   Recheck Cond: (order_details @> '{"l_shipmode": "AIR"}'::jsonb)
   ->  Bitmap Index Scan on od_gin_idx  (cost=0.00..561.90 rows=59986 width=0)
         Index Cond: (order_details @> '{"l_shipmode": "AIR"}'::jsonb)

Và chỉ số B-TREE thay vì GIN sẽ KHÔNG giúp ích gì cho

dbt3=# create index idx on products((order_details->>'l_shipmode'));
CREATE INDEX

dbt3=# \d products
                  Table "dbt3.products"
    Column     |  Type  | Collation | Nullable | Default
---------------+--------+-----------+----------+---------
 item_code     | bigint |           | not null |
 order_details | jsonb  |           |          |
Indexes:
    "products_pkey" PRIMARY KEY, btree (item_code)
    "idx" btree ((order_details ->> 'l_shipmode'::text))

Bạn có thể thấy bên dưới, truy vấn ưu tiên FULL-TABLE-SCAN

dbt3=# explain select * from products where order_details @> '{"l_shipmode" : "AIR"}';
                             QUERY PLAN
--------------------------------------------------------------------
 Seq Scan on products  (cost=0.00..4205822.65 rows=59986 width=252)
   Filter: (order_details @> '{"l_shipmode": "AIR"}'::jsonb)

Chỉ số GIN là gì?

GIN là viết tắt của Chỉ số đảo ngược tổng quát. Khả năng cốt lõi của GIN Index là tăng tốc độ tìm kiếm toàn văn. Khi thực hiện tìm kiếm dựa trên các Khóa hoặc phần tử cụ thể trong TEXT hoặc một tài liệu, GIN Index là cách để thực hiện. GIN Index lưu trữ các cặp "Khóa" (hoặc một phần tử hoặc một giá trị) và "danh sách vị trí". Danh sách vị trí là ID hàng của khóa. Điều này có nghĩa là, nếu “Khóa” xuất hiện ở nhiều vị trí trong tài liệu, Chỉ mục GIN chỉ lưu trữ Khóa một lần cùng với vị trí xuất hiện của nó, điều này không chỉ giữ cho Chỉ mục GIN có kích thước nhỏ gọn và còn giúp tăng tốc độ tìm kiếm một cách tuyệt vời. đường. Đây là cải tiến trong Postgres-9.4.

Những thách thức với Chỉ số GIN

Tùy thuộc vào độ phức tạp của dữ liệu, việc duy trì Chỉ số GIN có thể tốn kém. Việc tạo Chỉ mục GIN tiêu tốn thời gian và tài nguyên vì Chỉ mục phải tìm kiếm trong toàn bộ tài liệu để tìm các Khóa và ID hàng của chúng. Nó có thể còn khó khăn hơn nếu chỉ số GIN bị phình ra. Ngoài ra, kích thước của chỉ mục GIN có thể rất lớn dựa trên kích thước và độ phức tạp của dữ liệu.

JSON lập chỉ mục

JSON không hỗ trợ tìm kiếm văn bản và lập chỉ mục như GIN

dbt3=# create index pd_gin_idx on product using gin(productdetails jsonb_path_ops);
ERROR:  operator class "jsonb_path_ops" does not accept data type json

Lập chỉ mục thông thường như B-TREE được hỗ trợ bởi cả JSON và JSONB

Có, các chỉ mục thông thường như B-TREE Index được hỗ trợ bởi cả hai kiểu dữ liệu JSON và JSONB và không có lợi cho các hoạt động tìm kiếm văn bản. Mỗi khóa đối tượng JSON có thể được lập chỉ mục riêng lẻ, điều này sẽ thực sự hữu ích CHỈ khi cùng một khóa đối tượng được sử dụng trong mệnh đề WHERE.
Hãy để tôi tạo Chỉ mục B-TREE trên JSONB và xem nó hoạt động như thế nào

dbt3=# create index idx on products((order_details->>'l_shipmode'));
CREATE INDEX

dbt3=# \d products
                  Table "dbt3.products"
    Column     |  Type  | Collation | Nullable | Default
---------------+--------+-----------+----------+---------
 item_code     | bigint |           | not null |
 order_details | jsonb  |           |          |
Indexes:
    "products_pkey" PRIMARY KEY, btree (item_code)
    "idx" btree ((order_details ->> 'l_shipmode'::text))

Chúng ta đã biết ở trên rằng chỉ mục B-TREE KHÔNG hữu ích để tăng tốc các SQL thực hiện FULL-TEXT-SEARCHING trên dữ liệu JSON bằng cách sử dụng toán tử (như “@>”) và các Chỉ mục như vậy CHỈ giúp tăng tốc các truy vấn như bên dưới, là các SQL kiểu RDBMS điển hình (không phải là truy vấn tìm kiếm). Mỗi khóa đối tượng JSON có thể được lập chỉ mục riêng lẻ, điều này sẽ giúp các truy vấn tăng tốc khi các khóa đối tượng JSON được lập chỉ mục đó được sử dụng mệnh đề WHERE.
Ví dụ dưới đây truy vấn sử dụng Khóa đối tượng “l_shipmode” trong mệnh đề WHERE và kể từ nó được Lập chỉ mục truy vấn đang tiến hành quét chỉ mục. Nếu bạn muốn tìm kiếm bằng một Khóa đối tượng khác, thì truy vấn sẽ chọn thực hiện QUÉT TOÀN BỘ.

dbt3=# explain select * from products where order_details->>'l_shipmode'='AIR';
                                   QUERY PLAN
---------------------------------------------------------------------------------
 Index Scan using idx on products  (cost=0.56..1158369.34 rows=299930 width=252)
   Index Cond: ((order_details ->> 'l_shipmode'::text) = 'AIR'::text)

Tương tự cũng hoạt động với kiểu dữ liệu JSON

dbt3=# create index idx on products((order_details->>'l_shipmode'));
CREATE INDEX

dbt3=# \d products
                  Table "dbt3.products"
    Column     |  Type  | Collation | Nullable | Default
---------------+--------+-----------+----------+---------
 item_code     | bigint |           | not null |
 order_details | json  |           |          |
Indexes:
    "products_pkey" PRIMARY KEY, btree (item_code)
    "idx" btree ((order_details ->> 'l_shipmode'::text))

Nếu bạn có thể quan sát, truy vấn đang sử dụng Chỉ mục

dbt3=# explain select * from products where order_details->>'l_shipmode'='AIR';
                                   QUERY PLAN
---------------------------------------------------------------------------------
 Index Scan using idx on products  (cost=0.56..1158369.34 rows=299930 width=252)
   Index Cond: ((order_details ->> 'l_shipmode'::text) = 'AIR'::text)

Kết luận

Dưới đây là một số điều cần nhớ khi sử dụng PostgreSQL JSON Data ...

  • PostgreSQL là một trong những lựa chọn tốt nhất để lưu trữ và xử lý Dữ liệu JSON
  • Với tất cả các tính năng mạnh mẽ, PostgreSQL có thể là cơ sở dữ liệu tài liệu của bạn
  • Tôi đã thấy các kiến ​​trúc trong đó hai hoặc nhiều kho dữ liệu được chọn, với sự kết hợp của cơ sở dữ liệu PostgreSQL và NoSQL như cơ sở dữ liệu MongoDB hoặc Couchbase. API REST sẽ giúp các ứng dụng đẩy dữ liệu đến các kho dữ liệu khác nhau. Với việc PostgreSQL hỗ trợ JSON, bạn có thể tránh được sự phức tạp trong kiến ​​trúc bằng cách chỉ chọn một kho lưu trữ dữ liệu.
  • Dữ liệu JSON trong PostgreSQL có thể được truy vấn và lập chỉ mục, điều này mang lại hiệu suất và khả năng mở rộng đáng kinh ngạc
  • JSONB Loại dữ liệu là tùy chọn ưu tiên nhất vì nó có khả năng lưu trữ và hiệu suất tốt. Hỗ trợ đầy đủ FULL-TEXT-SEARCHING và Indexing. Hiển thị hiệu suất tốt
  • Chỉ sử dụng kiểu dữ liệu JSON nếu bạn muốn lưu trữ chuỗi JSON dưới dạng JSON và bạn không thực hiện nhiều tìm kiếm văn bản phức tạp
  • Lợi thế lớn nhất của việc có JSON trong PostgreSQL là việc tìm kiếm có thể được thực hiện bằng cách sử dụng SQLs
  • Hiệu suất tìm kiếm JSON trong PostgreSQL ngang bằng với các cơ sở dữ liệu NoSQL tốt nhất như MongoDB

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chọn hàng đầu tiên trong mỗi nhóm GROUP BY?

  2. PostgreSQL tương đương cho TOP n CÓ TIES:GIỚI HẠN với quan hệ?

  3. Làm cách nào để sửa lỗi phiên bản pg_dump không khớp?

  4. Xóa phụ huynh nếu nó không được tham chiếu bởi bất kỳ đứa trẻ nào khác

  5. Có thể sử dụng một biến và không chỉ định kiểu trả về trong postgreSQL không?