AliSQL menyediakan fitur mesin sequence yang memungkinkan Anda menggunakan mesin Sequence pada instance RDS untuk menghasilkan nilai sequence secara efisien.
Pengenalan
Nilai sequence unik yang meningkat secara monoton sering diperlukan untuk kunci utama dalam sistem database persisten satu node, pengidentifikasi unik global (GUID) dalam sistem terdistribusi, dan untuk idempotensi di antara beberapa sistem database. Setiap mesin database memiliki metode unik untuk memastikan nilai sequence unik. Sebagai contoh, MySQL menggunakan atribut AUTO_INCREMENT, sedangkan Oracle dan SQL Server menyediakan atribut SEQUENCE.
Dalam MySQL, proses menggunakan atribut AUTO_INCREMENT untuk mengenkapsulasi nilai sequence unik seperti tanggal atau nama pengguna dapat memakan waktu. Berikut adalah metode alternatif untuk menghasilkan nilai sequence secara efisien:
Gunakan aplikasi atau proxy untuk menghasilkan nilai sequence. Namun, pendekatan ini mengalihkan status nilai sequence ke aplikasi, sehingga membuat penskalaan lebih kompleks.
Gunakan tabel simulasi untuk menghasilkan nilai sequence. Metode ini memerlukan instalasi middleware untuk mengenkapsulasi dan menyederhanakan logika yang digunakan untuk mendapatkan nilai sequence.
Mesin Sequence kompatibel dengan berbagai mesin database dan membantu menghasilkan nilai sequence secara lebih efisien.
Mesin Sequence juga kompatibel dengan berbagai mesin penyimpanan yang digunakan dengan MySQL. Data persisten tetap disimpan menggunakan mesin penyimpanan yang ada, seperti InnoDB dan MyISAM, sehingga memastikan kompatibilitas dengan alat pihak ketiga seperti XtraBackup. Oleh karena itu, mesin Sequence hanya berfungsi sebagai mesin logis.
Mesin Sequence menggunakan Sequence Handler untuk mengakses objek sequence. Dengan cara ini, Anda dapat menambah nilai sequence menggunakan operator NEXTVAL dan mengelola data yang di-cache. Data dikirim ke mesin tabel dasar dan dapat diakses sesuai kebutuhan bisnis Anda.
Prasyarat
Instance RDS harus menjalankan salah satu versi MySQL berikut:
MySQL 8.0 dalam versi mesin minor 20190816 atau lebih baru
MySQL 5.7 dalam versi mesin minor 20210430 atau lebih baru
MySQL 5.6 dalam versi mesin minor 20170901 atau lebih baru
Instance RDS yang menjalankan Edisi Perusahaan RDS Tiga Node tidak didukung.
Batasan
Mesin Sequence tidak mendukung subquery atau query JOIN.
Anda dapat menggunakan
SHOW CREATE TABLEuntuk mengakses sequence.Saat membuat tabel, Anda tidak dapat menentukan mesin Sequence. Jika ingin menentukan mesin Sequence untuk tabel, Anda harus mengeksekusi pernyataan yang dijelaskan dalam bagian Buat sequence dari topik ini.
Buat sequence
Untuk membuat sequence, eksekusi pernyataan berikut:
CREATE SEQUENCE [IF NOT EXISTS] <Nama Database>.<Nama Sequence>
[START WITH <konstanta>]
[MINVALUE <konstanta>]
[MAXVALUE <konstanta>]
[INCREMENT BY <konstanta>]
[CACHE <konstanta> | NOCACHE]
[CYCLE | NOCYCLE]
;Saat mengeksekusi pernyataan di atas, Anda harus mengonfigurasi parameter yang diapit tanda kurung siku ([]).
Tabel berikut menjelaskan parameter tersebut.
Parameter | Deskripsi |
START WITH | Nilai awal sequence. |
MINVALUE | Nilai minimum sequence. |
MAXVALUE | Nilai maksimum sequence. Catatan Jika opsi NOCYCLE ditentukan untuk sequence, kesalahan berikut dilaporkan saat nilai maksimum tercapai: |
INCREMENT BY | Penambahan nilai sequence. |
CACHE/NOCACHE | Ukuran cache. Anda dapat menentukan ukuran cache yang lebih besar untuk meningkatkan performa instance RDS Anda. Jika instance RDS Anda di-restart, nilai sequence yang disimpan dalam cache akan hilang. |
CYCLE/NOCYCLE | Menentukan apakah nilai sequence diatur ulang ke nilai minimum yang ditentukan oleh parameter MINVALUE setelah nilai maksimum tercapai. Nilai valid:
|
Contoh:
create sequence s
start with 1
minvalue 1
maxvalue 9999999
increment by 1
cache 20
cycle;Jika Anda ingin menggunakan ekstensi mysqldump untuk mencadangkan instance RDS Anda, Anda dapat membuat tabel sequence dan menyisipkan baris awal ke dalam tabel sequence. Contoh:
CREATE TABLE schema.sequence_name ( `currval` bigint(21) NOT NULL COMMENT 'current value',
`nextval` bigint(21) NOT NULL COMMENT 'next value',
`minvalue` bigint(21) NOT NULL COMMENT 'min value',
`maxvalue` bigint(21) NOT NULL COMMENT 'max value',
`start` bigint(21) NOT NULL COMMENT 'start value',
`increment` bigint(21) NOT NULL COMMENT 'increment value',
`cache` bigint(21) NOT NULL COMMENT 'cache size',
`cycle` bigint(21) NOT NULL COMMENT 'cycle state',
`round` bigint(21) NOT NULL COMMENT 'already how many round'
) ENGINE=Sequence DEFAULT CHARSET=latin1;
INSERT INTO schema.sequence_name VALUES(0,0,1,9223372036854775807,1,1,10000,1,0);
COMMIT;Pengenalan tabel sequence
Sequence disimpan dalam tabel yang dibuat menggunakan mesin penyimpanan default. Saat Anda meminta sequence, sistem mengembalikan tabel yang dibuat menggunakan mesin penyimpanan default. Contoh:
SHOW CREATE TABLE schema.sequence_name;
CREATE TABLE schema.sequence_name (
`currval` bigint(21) NOT NULL COMMENT 'current value',
`nextval` bigint(21) NOT NULL COMMENT 'next value',
`minvalue` bigint(21) NOT NULL COMMENT 'min value',
`maxvalue` bigint(21) NOT NULL COMMENT 'max value',
`start` bigint(21) NOT NULL COMMENT 'start value',
`increment` bigint(21) NOT NULL COMMENT 'increment value',
`cache` bigint(21) NOT NULL COMMENT 'cache size',
`cycle` bigint(21) NOT NULL COMMENT 'cycle state',
`round` bigint(21) NOT NULL COMMENT 'already how many round'
) ENGINE=Sequence DEFAULT CHARSET=latin1Sintaksis permintaan
Mesin Sequence mendukung sintaksis berikut:
SELECT nextval(<Nama Sequence>),currval(<Nama Sequence>) FROM <Nama Sequence>;CatatanSintaksis ini didukung untuk MySQL 8.0 dan MySQL 5.7.
SELECT <Nama Sequence>.currval, <Nama Sequence>.nextval FROM dual;CatatanSintaksis ini didukung untuk MySQL 8.0, MySQL 5.7, dan MySQL 5.6.
Contoh:
mysql> SELECT test.currval, test.nextval from dual;
+--------------+--------------+
| test.currval | test.nextval |
+--------------+--------------+
| 24 | 25 |
+--------------+--------------+
1 row in set (0.03 sec)
Sebelum meminta nilai sequence baru, Anda harus mengeksekusi pernyataan berikut untuk memanggil NEXTVAL untuk sequence. Jika tidak, pesan kesalahan Sequence 'xxx' is not yet defined in current session akan ditampilkan.
Contoh:
SELECT <Nama Sequence>.nextval FROM dual;