Fitur Protobuf yang dapat dibaca telah ditambahkan di PolarDB for MySQL. Untuk bidang bertipe BLOB yang diserialisasi menggunakan Protobuf dan disimpan dalam database, Anda dapat mengonfigurasi skema Protobuf untuk mereka serta menggunakan fungsi PROTO_TO_JSON(blob_field) untuk membaca data mereka. Selain itu, Anda dapat menggunakan fungsi JSON_EXTRACT() untuk mengekstrak informasi tertentu dari data guna membuat indeks atau kolom virtual.
Informasi latar belakang
Di industri game, beberapa data diserialisasi menggunakan Protobuf dan bahkan dikompres menggunakan zlib sebelum disimpan ke dalam bidang bertipe BLOB di database. Data bertipe BLOB dalam database tidak dapat dibaca secara langsung, sehingga menyulitkan proses debugging dan pengembangan perangkat lunak. Bahkan dalam skenario analisis data, komponen tambahan diperlukan untuk membaca data tersebut.
Fungsi Protobuf yang dapat dibaca yang disediakan oleh PolarDB for MySQL memungkinkan visualisasi data yang diserialisasi menggunakan Protobuf dan dikompres menggunakan zlib tanpa memerlukan komponen tambahan.
Prasyarat
Kluster PolarDB harus menggunakan versi PolarDB for MySQL 8.0 dengan revisi versi 8.0.2.2.5 atau lebih baru. Untuk informasi lebih lanjut tentang cara memeriksa versi kluster, lihat Kueri versi mesin.
Penggunaan
- Configure a Protobuf schemaSyntax
ParametersALTER TABLE nama_tabel ALTER COLUMN nama_kolom [PROTO_NAME = nama_skema_protobuf] PROTO_TEXT = definisi_skema_protobuf PROTO_MESSAGE = pesan_serialisasi_protobuf [COMPRESSION = algoritma_kompresi]Parameter Wajib Deskripsi PROTO_NAME Tidak Nama skema Protobuf. PROTO_TEXT Ya Definisi skema Protobuf. PROTO_MESSAGE Ya Pesan serialisasi Protobuf. COMPRESSION Tidak Parameter ini hanya diperlukan jika data pesan serialisasi Protobuf dikompres menggunakan zlib sebelum ditulis ke dalam database. Atur nilainya menjadi zlib. Catatan Data yang dikompres dengan zlib dapat didekompres menggunakan fungsiUNCOMPRESS()menjadi data heksadesimal. - Remove the Protobuf schema definition of a fieldAnda dapat mengosongkan parameter PROTO_TEXT untuk menghapus definisi skema Protobuf suatu bidang. Jalankan pernyataan berikut:
ALTER TABLE nama_tabel ALTER COLUMN nama_kolom PROTO_NAME="" PROTO_TEXT="" PROTO_MESSAGE='';Catatan Sebelum menghapus definisi skema Protobuf suatu bidang, pastikan bahwa bidang tersebut telah dilepaskan dari indeks dan kolom virtual. - View the Protobuf schema definition of a field
- Jalankan pernyataan berikut untuk mengatur parameter display_readable_proto_info menjadi true:
SET display_readable_proto_info=true; - Jalankan pernyataan berikut untuk melihat definisi skema Protobuf suatu bidang:
SHOW columns FROM nama_tabel
- Jalankan pernyataan berikut untuk mengatur parameter display_readable_proto_info menjadi true:
Contoh
PROTO_TO_JSON(blob_field) untuk mengekstrak informasi tertentu dari data guna membuat indeks atau kolom virtual. Tabel t1 digunakan dalam contoh-contoh ini.- Buat tabel bernama
t1. Jalankan pernyataan berikut:
BidangCREATE TABLE t1(c1 INT, c2 BLOB);c2bertipe BLOB dan diserialisasi menggunakan Protobuf. - Tambahkan definisi skema Protobuf untuk bidang
c2.Contoh di mana addressbook.proto dari komunitas Protobuf digunakan:syntax = "proto2"; package tutorial; message Person { optional string name = 1; optional int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { optional string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phones = 4; } message AddressBook { repeated Person people = 1; }- Contoh di mana data tidak dikompres menggunakan zlib:
ALTER TABLE t1 ALTER COLUMN c2 PROTO_NAME="AddressBook" PROTO_TEXT="syntax = \"proto2\";\n\npackage tutorial;\n\nmessage Person {\n optional string name = 1;\n optional int32 id = 2;\n optional string email = 3;\n\n enum PhoneType {\n MOBILE = 0;\n HOME = 1;\n WORK = 2;\n }\n\n message PhoneNumber {\n optional string number = 1;\n optional PhoneType type = 2 [default = HOME];\n }\n\n repeated PhoneNumber phones = 4;\n}\n\nmessage AddressBook {\n repeated Person people = 1;\n}" PROTO_MESSAGE='AddressBook'; - Contoh di mana data dikompres menggunakan zlib:
ALTER TABLE t1 ALTER COLUMN c2 PROTO_NAME="AddressBook" PROTO_TEXT="syntax = \"proto2\";\n\npackage tutorial;\n\nmessage Person {\n optional string name = 1;\n optional int32 id = 2;\n optional string email = 3;\n\n enum PhoneType {\n MOBILE = 0;\n HOME = 1;\n WORK = 2;\n }\n\n message PhoneNumber {\n optional string number = 1;\n optional PhoneType type = 2 [default = HOME];\n }\n\n repeated PhoneNumber phones = 4;\n}\n\nmessage AddressBook {\n repeated Person people = 1;\n}" PROTO_MESSAGE='AddressBook' COMPRESSION='zlib';
- Contoh di mana data tidak dikompres menggunakan zlib:
- Tulis data yang diserialisasi menggunakan Protobuf ke tabel
t1.- Contoh di mana data tidak dikompres menggunakan zlib:
INSERT INTO t1 VALUES(1, X'0a380a0b56697375616c50726f746f10011a1776697375616c70726f746f40706f6c617264622e636f6d220e0a0a313233343536373839301002'); - Contoh di mana data dikompres menggunakan zlib:
Data yang dikompres dengan zlib dapat didekompres menggunakan fungsiINSERT INTO t1 VALUES(1, X'3C000000785ee3b2e0e20ecb2c2e4dcc0928ca2fc9176094122f03730b405c8782fc9cc4a29424bde4fc5c253e2e2e432363135333730b4b03012600183d10de');UNCOMPRESS(). Contoh di mana data dikompres menggunakan zlib:
Hasil sampel data heksadesimal yang didekompres:SELECT HEX(uncompress(X'3C000000785ee3b2e0e20ecb2c2e4dcc0928ca2fc9176094122f03730b405c8782fc9cc4a29424bde4fc5c253e2e2e432363135333730b4b03012600183d10de')) AS UNCOMPRESS_DATA;+----------------------------------------------------------------------------------------------------------------------+ | UNCOMPRESS_DATA | +----------------------------------------------------------------------------------------------------------------------+ | 0A380A0B56697375616C50726F746F10011A1776697375616C70726F746F40706F6C617264622E636F6D220E0A0A313233343536373839301002 | +----------------------------------------------------------------------------------------------------------------------+
- Contoh di mana data tidak dikompres menggunakan zlib:
- Baca data di kolom
c2atau ekstrak data dari kolomc2untuk membuat indeks atau kolom virtual.- Baca data di kolom
c2.- Baca data di kolom
c2ketika fungsiPROTO_TO_JSON(blob_field)tidak digunakan.- Jika data tidak dikompres menggunakan zlib, jalankan pernyataan berikut untuk membaca data dari kolom
c2:
Hasil sampel data yang dibaca:SELECT c2 FROM t1\G*************************** 1. row *************************** c2: 8 VisualProtovisualproto@polardb.com" 1234567890 - Jika data dikompres menggunakan zlib, jalankan pernyataan berikut untuk membaca data di kolom
c2:
Hasil sampel data yang dibaca:SELECT c2 FROM t1\G*************************** 1. row *************************** c2: < x^����,. M� (�/�'�/s @\����$���\%>..C#cS3s K& =�
- Jika data tidak dikompres menggunakan zlib, jalankan pernyataan berikut untuk membaca data dari kolom
- Baca data di kolom
c2ketika fungsiPROTO_TO_JSON(blob_field)digunakan.
Hasil sampel data yang dibaca:SELECT PROTO_TO_JSON(c2) FROM t1;+------------------------------------------------------------------------------------------------------------------------------------------+ | PROTO_TO_JSON(c2) | +------------------------------------------------------------------------------------------------------------------------------------------+ | {"people": [{"id": 1, "name": "VisualProto", "email": "visualproto@polardb.com", "phones": [{"type": "WORK", "number": "1234567890"}]}]} | +------------------------------------------------- ----------------------------------------------------------------------+Catatan FungsiPROTO_TO_JSON(blob_field)dapat membaca baik data yang dikompres menggunakan zlib maupun data yang tidak dikompres menggunakan zlib. - Gunakan fungsi JSON untuk mengekstrak data di kolom
c2. Contoh:
Hasil sampel data yang diekstrak:SELECT json_extract(PROTO_TO_JSON(c2), '$.people[0].name') FROM t1;+-----------------------------------------------------+ | json_extract(PROTO_TO_JSON(c2), '$.people[0].name') | +-----------------------------------------------------+ | "VisualProto" | +-----------------------------------------------------+
- Baca data di kolom
- Ekstrak data di kolom
c2untuk membuat indeks. Contoh:
Jalankan pernyataan EXPLAIN untuk memeriksa kinerja eksekusi pernyataan SQL sebelumnya. Contoh:CREATE INDEX i_email ON t1((cast(JSON_UNQUOTE(json_extract(PROTO_TO_JSON(c2), '$.people[0].email')) AS char(100))));
Hasil sampel:EXPLAIN SELECT * FROM t1 WHERE (cast(JSON_UNQUOTE(json_extract(PROTO_TO_JSON(c2), '$.people[0].ema+----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+-------+ | 1 | SIMPLE | t1 | NULL | ref | i_email | i_email | 403 | const | 1 | 100.00 | NULL | +----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+-------+ - Ekstrak data di kolom
c2untuk membuat kolom virtual. Contoh:
Jalankan pernyataan berikut untuk melihat skema tabelALTER TABLE t1 ADD COLUMN c3 varchar(100) AS (json_extract(proto_to_json(`c2`), _utf8mb4'$.people[0].email'));t1:
Skema sampel tabeldesc t1;t1:+-------+--------------+------+-----+---------+-------------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------------------+ | c1 | int(11) | YES | | NULL | | | c2 | blob | YES | | NULL | | | c3 | varchar(100) | YES | | NULL | VIRTUAL GENERATED | +-------+--------------+------+-----+---------+-------------------+c3adalah kolom virtual yang baru dibuat.
- Baca data di kolom