ApsaraDB for SelectDB varsayılan olarak sütun deposu kullanır. Geniş tablolarda bu durum, tek bir satırı getirirken rastgele okuma G/Ç'sini artırarak nokta sorgularını yavaşlatır. Frontend (FE) Java ile yazıldığından, yüksek hacimli eşzamanlı SQL sorgularının ayrıştırılması yüksek CPU yüküne neden olur. Bu sorunları çözmek için SelectDB; satır deposu, kısa sorgu yolu ve hazırlanmış deyimler olmak üzere üç tamamlayıcı mekanizma sunar. Bu mekanizmalar, yüksek eşzamanlı nokta sorgularındaki gecikme süresini önemli ölçüde azaltır.
Nasıl çalışır?
| Mekanizma | İşlevi |
|---|---|
| Satır deposu | Her satırın bir kopyasını satır formatında saklar; nokta sorguları için sütun sütun G/Ç yapma ihtiyacını ortadan kaldırır |
| Kısa sorgu yolu | Sorgu iyileştiricisinin standart yürütme motorunu atlamasına ve birincil anahtar aramalarını tek bir uzak yordam çağrısı (RPC) ile çözmesine olanak tanır |
| Hazırlanmış deyimler | Ayrıştırılmış SQL'i ve ifadeleri FE'de oturum düzeyinde önbelleğe alır; yüksek eşzamanlı iş yüklerinden kaynaklanan tekrarlayan ayrıştırma yükünü kaldırır |
Satır deposunu ne zaman kullanmalısınız?
Satır deposu ek depolama alanı tüketir. Etkinleştirip etkinleştirmeyeceğinize karar vermek için aşağıdaki tabloyu kullanın.
| Senaryo | Önerilen depolama | Öneri |
|---|---|---|
| Yüksek eşzamanlı birincil anahtar aramaları | Satır deposu | Satır deposunu + yazma sırasında birleştirme (MoW) özelliğini etkinleştirin |
| Geniş tablolar üzerinde karmaşık toplamalar ve çok tablolu JOIN'ler | Sütun deposu | Varsayılan sütun deposunu koruyun |
| Karışık iş yükleri (nokta sorguları + analitik) | İkisi de | Satır deposunu seçici olarak etkinleştirin |
Satır deposunu etkinleştirin
Satır deposu, tablo oluşturma sırasında etkinleştirilmelidir. CREATE TABLE ifadesine aşağıdaki özelliği ekleyin:
"store_row_column" = "true"
Tablo oluşturulduktan sonra satır deposu etkinleştirilemez veya devre dışı bırakılamaz.
Unique Key modelinde nokta sorgularını optimize edin
Unique Key modeli tablosunda hem enable_unique_key_merge_on_write hem de store_row_column parametreleri true olarak ayarlandığında, sorgu iyileştiricisi birincil anahtar nokta sorguları için kısa bir sorgu yolunu etkinleştirir. Bu tür bir sorguyu yürütmek için yalnızca bir RPC gerekir.
Aşağıdaki örnek, satır deposu ve MoW özelliği etkinleştirilmiş bir tablo oluşturur:
CREATE TABLE `tbl_point_query` (
`key` int(11) NULL,
`v1` decimal(27, 9) NULL,
`v2` varchar(30) NULL,
`v3` varchar(30) NULL,
`v4` date NULL,
`v5` datetime NULL,
`v6` float NULL,
`v7` datev2 NULL
) ENGINE=OLAP
UNIQUE KEY(`key`)
COMMENT 'OLAP'
DISTRIBUTED BY HASH(`key`) BUCKETS 16
PROPERTIES (
"enable_unique_key_merge_on_write" = "true",
"light_schema_change" = "true",
"store_row_column" = "true"
);
| Özellik | Değer | Amaç |
|---|---|---|
enable_unique_key_merge_on_write |
true |
Depolama motorunun satırları birincil anahtara göre hızlıca bulabilmesi için MoW özelliğini etkinleştirir |
store_row_column |
true |
Hızlı tam satır getirme işlemi için satır deposunu etkinleştirir |
light_schema_change |
true |
Kısa sorgu yolu için gereklidir; iyileştirici, sütunları konumlandırmak amacıyla hafif şema değişikliğinden gelen benzersiz sütun kimliğini kullanır |
Kısa sorgu yolu yalnızca WHERE yan tümcesinin tek bir tablonun anahtar sütunlarında eşitlik koşulları içermesi durumunda geçerlidir. Örneğin:
SELECT * FROM tbl_point_query WHERE key = 123;
Hazırlanmış deyimleri kullanın
Hazırlanmış deyimler MySQL protokolüyle tamamen uyumludur. FE'de etkinleştirildiğinde SelectDB, her SQL ifadesini ve ilgili ifadeleri bir kez ayrıştırır, ardından sonucu oturum düzeyindeki bellekte önbelleğe alır. Sonraki çalıştırmalar önbelleğe alınan nesneleri yeniden kullanarak ayrıştırma adımını tamamen atlar. CPU sınırlı birincil anahtar nokta sorguları için bu yaklaşım aktarım hızını dört katından fazla artırabilir.
Hazırlanmış deyimler yalnızca birincil anahtarlara dayalı nokta sorguları için çalışır.
Java Database Connectivity (JDBC) üzerinden hazırlanmış deyimleri etkinleştirin:
-
JDBC URL'sine
useServerPrepStmts=trueparametresini ekleyin:jdbc:mysql://127.0.0.1:9030/ycsb?useServerPrepStmts=true -
İfadeyi bir kez hazırlayın ve sorgular arasında
PreparedStatementnesnesini yeniden kullanın:// Use ? as a placeholder. Reuse readStatement across multiple queries. PreparedStatement readStatement = conn.prepareStatement( "SELECT * FROM tbl_point_query WHERE key = ?" ); readStatement.setInt(1, 1234); ResultSet resultSet = readStatement.executeQuery(); // Reuse the same statement for the next query readStatement.setInt(1, 1235); resultSet = readStatement.executeQuery();
Satır önbelleğini etkinleştirin
SelectDB, verileri sütun sütun depolayan bir sayfa önbelleği içerir; her sayfa bir sütunun verisini tutar. Satır deposu modunda tek bir sayfa birden çok sütundan veri barındırır. Bu durum, büyük analitik sorgular tarafından önbellekten çıkarılmaya karşı daha hassas hale gelerek önbellek isabet oranlarını düşürür.
Satır önbelleği, en az kullanılan (LRU) çıkarma ilkesini kullanan özel bir satır düzeyi önbelleği bakımını yaparak bu sorunu giderir. Böylece, büyük analitik sorgular önbellek alanı için rekabet ettiğinde bile sık erişilen satırlar bellekte kalır.
Satır önbelleğini backend (BE) ayarlarında yapılandırın:
| Parametre | Varsayılan | Açıklama |
|---|---|---|
disable_storage_row_cache |
false |
Satır önbelleğinin kullanılabilirliğini kontrol eder. Varsayılan değer false olup satır önbelleğini etkin tutar. Bellek yükünü azaltmak için satır önbelleğini devre dışı bırakmak üzere değeri true olarak ayarlayın. |
row_cache_mem_limit |
20 |
Satır önbelleğine ayrılan maksimum bellek yüzdesi. Varsayılan değer %20'dir. |
Sınırlamalar
Satır deposu yalnızca tablo oluşturma sırasında etkinleştirilebilir. Mevcut bir tablonun değiştirilmesi desteklenmez.
Kısa sorgu yolu yalnızca tek bir tablonun anahtar sütunlarındaki eşitlik koşulları (
=) için geçerlidir. JOIN sorguları ve iç içe geçmiş alt sorgular desteklenmez.WHEREyan tümcesi yalnızca anahtar sütunlara başvurmalıdır (anahtar-değer çifti sorguları).Hazırlanmış deyimler yalnızca birincil anahtar nokta sorguları için çalışır.
Kısa sorgu yolunun doğru çalışması için
light_schema_change = trueayarı gereklidir.