AliSQL menyediakan Sequence Engine untuk menyederhanakan proses pengambilan nilai sequence.
Pendahuluan
Sistem database persisten sering memerlukan nilai unik yang meningkat secara monoton untuk berbagai kasus penggunaan, seperti kunci utama bisnis pada node tunggal, pengidentifikasi unik global dalam sistem terdistribusi, atau kontrol idempotensi di berbagai sistem. Sistem database yang berbeda menyediakan metode implementasi yang berbeda pula. Sebagai contoh, MySQL menyediakan atribut AUTO_INCREMENT, sedangkan Oracle dan SQL Server menyediakan objek SEQUENCE.
Pada database MySQL, penggunaan AUTO_INCREMENT bisa menjadi tidak praktis jika Anda ingin mengenkapsulasi nilai unik dengan informasi tambahan, seperti tanggal atau ID pengguna. Dalam praktiknya, solusi alternatif berikut umum digunakan:
Menghasilkan nilai sequence dari aplikasi atau proxy. Namun, mempertahankan state di sisi aplikasi mempersulit proses scaling out dan scaling in.
Menghasilkan nilai sequence dari tabel simulasi di dalam database. Metode ini memerlukan middleware untuk mengenkapsulasi dan menyederhanakan logika pengambilan nilai unik.
Sequence Engine dirancang agar sekompatibel mungkin dengan metode yang digunakan oleh database lain.
Sequence Engine mengimplementasikan antarmuka storage engine MySQL, tetapi menggunakan storage engine yang sudah ada—seperti InnoDB atau MyISAM—untuk menyimpan data persisten. Hal ini menjadikannya kompatibel dengan alat pihak ketiga seperti XtraBackup, sehingga Sequence Engine merupakan engine logis.
Sequence Engine mengakses objek Sequence melalui antarmuka Sequence Handler untuk mengelola peningkatan NEXTVAL dan manajemen cache. Permintaan tersebut kemudian diteruskan ke storage engine tabel dasar untuk akses data akhir.
Prasyarat
Instans Anda harus menggunakan salah satu versi berikut:
RDS for MySQL 8.4
RDS for MySQL 8.0 dengan versi mesin minor 20190816 atau lebih baru
RDS for MySQL 5.7 dengan versi mesin minor 20210430 atau lebih baru
RDS for MySQL 5.6 dengan versi mesin minor 20170901 atau lebih baru
Fitur ini tidak didukung pada instans RDS Enterprise Edition.
Batasan
Sequence tidak mendukung subquery atau join.
Anda dapat menggunakan
SHOW CREATE TABLEuntuk melihat struktur sequence.Anda tidak dapat menentukan engine Sequence saat membuat tabel. Tabel sequence hanya dapat dibuat menggunakan sintaksis Create a sequence.
Create a sequence
CREATE SEQUENCE [IF NOT EXISTS] <database_name>.<sequence_name>
[START WITH <constant>]
[MINVALUE <constant>]
[MAXVALUE <constant>]
[INCREMENT BY <constant>]
[CACHE <constant> | NOCACHE]
[CYCLE | NOCYCLE]
;Parameter dalam tanda kurung siku ([]) bersifat opsional.
Tabel berikut menjelaskan parameter-parameter tersebut.
Parameter | Deskripsi |
START WITH | Nilai awal sequence. |
MINVALUE | Nilai minimum sequence. |
MAXVALUE | Nilai maksimum sequence. Catatan Jika Anda menentukan NOCYCLE, error berikut akan dikembalikan saat nilai maksimum tercapai: |
INCREMENT BY | Langkah antara nilai sequence yang berurutan. |
CACHE/NOCACHE | Ukuran cache. Untuk performa yang lebih baik, Anda dapat mengatur ukuran cache yang besar. Namun, jika instans restart, nilai yang belum digunakan dalam cache akan hilang. |
CYCLE/NOCYCLE | Menentukan apakah sequence dapat dimulai ulang dari MINVALUE setelah habis. Nilai yang valid:
|
Contoh:
create sequence s
start with 1
minvalue 1
maxvalue 9999999
increment by 1
cache 20
cycle;Untuk memastikan kompatibilitas dengan backup yang dibuat menggunakan mysqldump, Anda juga dapat membuat sequence dengan membuat tabel sequence dan memasukkan catatan awal. 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;Sequence table definition
Sequence disimpan dalam sebuah tabel. Anda dapat melihat definisinya dengan menjalankan perintah SHOW CREATE TABLE. 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=latin1Query syntax
Sequence mendukung sintaksis kueri berikut:
SELECT nextval(<sequence_name>),currval(<sequence_name>) FROM <sequence_name>;CatatanBerlaku untuk RDS for MySQL 8.4, 8.0, dan 5.7.
SELECT <sequence_name>.currval, <sequence_name>.nextval FROM dual;CatatanBerlaku untuk RDS for MySQL 8.4, 8.0, 5.7, dan 5.6.
Contoh:
mysql> SELECT test.currval, test.nextval from dual;
+--------------+--------------+
| test.currval | test.nextval |
+--------------+--------------+
| 24 | 25 |
+--------------+--------------+
1 row in set (0.03 sec)
Untuk sequence yang baru dibuat, Anda harus memanggil NEXTVAL sekali untuk menginisialisasinya sebelum dapat dilakukan kueri. Jika tidak, error Sequence 'xxx' is not yet defined in current session akan dikembalikan.
Contoh pemanggilan NEXTVAL:
SELECT <sequence_name>.nextval FROM dual;