Topik ini menjelaskan tipe data yang didukung oleh AnalyticDB for MySQL, perbedaan mereka dari tipe data MySQL, serta aturan konversi tipe implisit.
Tipe data dasar yang didukung oleh AnalyticDB for MySQL
Kategori | Tipe Data | Deskripsi | Perbandingan dengan Tipe Data MySQL |
Numerik |
| Nilai valid:
| Tidak ada perbedaan. |
| Nilai valid: | Tidak ada perbedaan. | |
| Nilai valid: | Tidak ada perbedaan. | |
| Nilai valid: | Tipe | |
| Nilai valid: | Tidak ada perbedaan. | |
| Nilai valid: | Tidak ada perbedaan. | |
| Nilai valid: | Tidak ada perbedaan. | |
|
|
Untuk menyesuaikan presisi maksimum, hubungi Dukungan Teknis. | |
String |
| Nilai VARCHAR dapat mencapai ukuran hingga 16 MB. Anda tidak perlu menentukan panjang saat menggunakan VARCHAR. Catatan Jika Anda menentukan panjang, seperti VARCHAR(255), angka dalam tanda kurung hanya digunakan untuk kompatibilitas sintaksis. Panjang sebenarnya bervariasi berdasarkan ukuran data (hingga 16 MB) dan mungkin melebihi 255 karakter. Jangan melakukan validasi panjang dengan menggunakan panjang yang ditentukan. | Tipe |
| Panjang penyimpanan karakter. | Tipe | |
Waktu |
| Nilai valid: |
|
| Nilai valid: |
| |
| Nilai valid: Penting Secara default, |
| |
| Nilai valid: Catatan Secara default, |
| |
Spatial |
| Koordinat geografis x dan y. | Tidak ada perbedaan. |
Konversi Tipe Implisit
Konversi tipe implisit mengacu pada konversi tipe otomatis yang dilakukan oleh AnalyticDB for MySQL berdasarkan konteks dan aturan konversi tipe saat Anda menjalankan operasi kueri SQL.
Aturan konversi tipe implisit dari AnalyticDB for MySQL mencakup tipe data dasar yang umum. Tipe data kompleks tidak mendukung konversi tipe implisit.
Jika aturan konversi tipe implisit default tidak memenuhi persyaratan bisnis Anda, Anda dapat menggunakan konversi tipe eksplisit.
Aturan Konversi Proyeksi
Ketika kolom dalam pernyataan SELECT dibandingkan dengan konstanta, tipe pengembalian akan dikonversi secara implisit ke tipe data yang ditampilkan dalam tabel berikut. Jika konversi tipe implisit tidak didukung, terjadi kesalahan.
Kolom/Konstanta | VARCHAR | BOOLEAN | TINYINT | SMALLINT | INTEGER | BIGINT | DECIMAL | DOUBLE | TIME | DATE | TIMESTAMP | DATETIME |
VARCHAR | VARCHAR | BOOLEAN | BIGINT | BIGINT | BIGINT | BIGINT | DECIMAL | DOUBLE | TIME | DATE | TIMESTAMP | DATETIME |
BOOLEAN | BOOLEAN | BOOLEAN | TINYINT | SMALLINT | INTEGER | BIGINT | Tidak didukung | DOUBLE | Tidak didukung | Tidak didukung | Tidak didukung | Tidak didukung |
TINYINT | BIGINT | TINYINT | TINYINT | SMALLINT | INTEGER | BIGINT | DECIMAL | DOUBLE | Tidak didukung | Tidak didukung | Tidak didukung | Tidak didukung |
SMALLINT | BIGINT | SMALLINT | SMALLINT | SMALLINT | INTEGER | BIGINT | DECIMAL | DOUBLE | Tidak didukung | Tidak didukung | Tidak didukung | Tidak didukung |
INTEGER | BIGINT | INTEGER | INTEGER | INTEGER | INTEGER | BIGINT | DECIMAL | DOUBLE | BIGINT | BIGINT | BIGINT | BIGINT |
BIGINT | BIGINT | BIGINT | BIGINT | BIGINT | BIGINT | BIGINT | DECIMAL | DOUBLE | BIGINT | BIGINT | BIGINT | BIGINT |
DECIMAL | DECIMAL | Tidak didukung | DECIMAL | DECIMAL | DECIMAL | DECIMAL | DECIMAL | DOUBLE | Tidak didukung | Tidak didukung | Tidak didukung | Tidak didukung |
DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE |
TIME | TIME | Tidak didukung | Tidak didukung | Tidak didukung | BIGINT | BIGINT | Tidak didukung | DOUBLE | TIME | BIGINT | BIGINT | DATETIME |
DATE | DATE | Tidak didukung | Tidak didukung | Tidak didukung | BIGINT | BIGINT | Tidak didukung | DOUBLE | BIGINT | TIMESTAMP | TIMESTAMP | DATETIME |
TIMESTAMP | TIMESTAMP | Tidak didukung | Tidak didukung | Tidak didukung | BIGINT | BIGINT | Tidak didukung | DOUBLE | BIGINT | TIMESTAMP | TIMESTAMP | DATETIME |
DATETIME | DATETIME | Tidak didukung | Tidak didukung | Tidak didukung | BIGINT | BIGINT | Tidak didukung | DOUBLE | DATETIME | DATETIME | DATETIME | DATETIME |
Aturan Konversi Filter
Saat kolom dalam klausa WHERE dibandingkan dengan konstanta, tipe pengembalian akan dikonversi secara implisit menjadi tipe data yang ditampilkan dalam tabel berikut. Jika konversi tipe implisit tidak didukung, terjadi kesalahan.
Jika tipe data berbeda, konversi tipe implisit dapat menyebabkan kegagalan pushdown, memicu pemindaian tabel penuh yang secara signifikan mengurangi kinerja kueri. Pushdown merujuk pada mendorong kondisi filter ke lapisan penyimpanan untuk penyaringan berbasis indeks. Ini mengurangi beban pemindaian data ketika tingkat filter tinggi, sehingga meningkatkan kinerja kueri.
Dalam tabel berikut, 1 sebelum tipe data pengembalian menunjukkan pushdown berhasil, dan 0 menunjukkan kegagalan pushdown.
Kolom/Konstanta | VARCHAR | BOOLEAN | TINYINT | SMALLINT | INTEGER | BIGINT | DECIMAL | REAL | DOUBLE | TIME | DATE | TIMESTAMP | DATETIME |
VARCHAR | 1 VARCHAR | 0 BOOLEAN | 0 BIGINT | 0 BIGINT | 0 BIGINT | 0 BIGINT | 0 DECIMAL | 0 REAL | 0 DOUBLE | 0 TIME | 0 DATE | 0 TIMESTAMP | 0 DATETIME |
BOOLEAN | 1 BOOLEAN | 1 BOOLEAN | 0 TINYINT | 0 SMALLINT | 0 INTEGER | 0 BIGINT | Tidak didukung | 0 REAL | 0 DOUBLE | Tidak didukung | Tidak didukung | Tidak didukung | Tidak didukung |
TINYINT | 1 TINYINT | 1 TINYINT | 1 TINYINT | 1 TINYINT | 1 TINYINT | 1 TINYINT | 0 DECIMAL | 0 REAL | 0 DOUBLE | Tidak didukung | Tidak didukung | Tidak didukung | Tidak didukung |
SMALLINT | 1 SMALLINT | 1 SMALLINT | 1 SMALLINT | 1 SMALLINT | 1 SMALLINT | 1 SMALLINT | 0 DECIMAL | 0 REAL | 0 DOUBLE | Tidak didukung | Tidak didukung | Tidak didukung | Tidak didukung |
INTEGER | 1 INTEGER | 1 INTEGER | 1 INTEGER | 1 INTEGER | 1 INTEGER | 1 INTEGER | 0 DECIMAL | 0 REAL | 0 DOUBLE | 1 INTEGER | 1 INTEGER | INTEGER | INTEGER |
BIGINT | 1 BIGINT | 1 BIGINT | 1 BIGINT | 1 BIGINT | 1 BIGINT | 1 BIGINT | 0 DECIMAL | 0 REAL | 0 DOUBLE | 1 BIGINT | 1 BIGINT | BIGINT | BIGINT |
DECIMAL | 1 DECIMAL | 1 DECIMAL | 1 DECIMAL | 1 DECIMAL | 1 DECIMAL | 1 DECIMAL | 1 DECIMAL | 0 REAL | 0 DOUBLE | Tidak didukung | Tidak didukung | Tidak didukung | Tidak didukung |
REAL | 1 REAL | 1 REAL | 1 REAL | 1 REAL | 1 REAL | 1 REAL | 1 REAL | 1 REAL | 0 DOUBLE | Tidak didukung | Tidak didukung | Tidak didukung | Tidak didukung |
DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE |
TIME | 1 TIME | Tidak didukung | Tidak didukung | Tidak didukung | 0 BIGINT | 0 BIGINT | Tidak didukung | Tidak didukung | 0 DOUBLE | 1 TIME | 0 BIGINT | 0 BIGINT | 0 DATETIME |
DATE | 1 DATE | Tidak didukung | Tidak didukung | Tidak didukung | 0 BIGINT | 0 BIGINT | Tidak didukung | Tidak didukung | 0 DOUBLE | 0 BIGINT | 1 DATE | 0 TIMESTAMP | 0 DATETIME |
TIMESTAMP | 1 TIMESTAMP | Tidak didukung | Tidak didukung | Tidak didukung | 0 BIGINT | 0 BIGINT | Tidak didukung | Tidak didukung | 0 DOUBLE | 1 TIMESTAMP | 1 TIMESTAMP | 1 TIMESTAMP | 1 TIMESTAMP |
DATETIME | 1 DATETIME | Tidak didukung | Tidak didukung | Tidak didukung | 0 BIGINT | 0 BIGINT | Tidak didukung | Tidak didukung | 0 DOUBLE | 1 DATETIME | 1 DATETIME | 1 DATETIME | 1 DATETIME |
Otimisasi konversi tipe paksa (ENFORCE_UNWRAP_CAST)
Optimasi konversi tipe paksa digunakan dalam sistem database untuk mengontrol konversi tipe. Ini menangani degradasi kinerja kueri dan masalah akurasi hasil yang disebabkan oleh konversi tipe implisit.
Metode Konfigurasi
Optimasi konversi tipe paksa mendukung dua metode konfigurasi. Anda dapat memilih salah satu berdasarkan kebutuhan bisnis Anda.
Konfigurasi Global
Aktifkan optimasi dengan menyetel parameter global, yang berlaku untuk semua kueri.
SET ADB_CONFIG ENFORCE_UNWRAP_CAST = true;Konfigurasi Hint
Sementara aktifkan optimasi untuk kueri tertentu tanpa memengaruhi kueri lainnya.
/*+ ENFORCE_UNWRAP_CAST=true */
Contoh
Kolom col dalam tabel test bertipe VARCHAR dan berisi nilai '1', '1a', dan 'abc'. Jalankan pernyataan berikut:
SELECT col FROM test WHERE col = 1;Hasilnya bervariasi berdasarkan status konfigurasi parameter enforce_unwrap_cast.
Status default dinonaktifkan (
ENFORCE_UNWRAP_CAST=false): Sistem secara implisit mengonversi kolom VARCHAR menjadi tipe BIGINT untuk perbandingan. Dalam hal ini,'1'dan'1a'dipotong, dan bagian non-numerik dikonversi menjadi nilai numerik 1 untuk perbandingan. Dua hasil cocok,'1'dan'1a', dikembalikan. Karena konversi tipe implisit dilakukan pada nilai kolom, optimasi pushdown gagal dipicu, dan sistem perlu memindai seluruh tabel. Dalam hal ini, kinerja kueri menurun.Status diaktifkan (
ENFORCE_UNWRAP_CAST=true): Sistem mengonversi konstanta INTEGER menjadi tipe VARCHAR untuk perbandingan string. Dalam hal ini, hanya'1'yang cocok dengan konstanta1, dan'1a'difilter karena ketidakcocokan string. Hanya satu hasil cocok,'1', yang dikembalikan. Kebijakan optimasi ini dapat mendorong logika perbandingan ke lapisan penyimpanan, yang secara efektif mengurangi jumlah data yang dipindai dan meningkatkan kinerja kueri.