Tüm Ürünler
Search
Belge Merkezi

ApsaraDB for SelectDB:High-concurrency point queries

Son Güncelleme:Oct 07, 2026

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:

  1. JDBC URL'sine useServerPrepStmts=true parametresini ekleyin:

    jdbc:mysql://127.0.0.1:9030/ycsb?useServerPrepStmts=true
  2. İfadeyi bir kez hazırlayın ve sorgular arasında PreparedStatement nesnesini 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.

  • WHERE yan 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 = true ayarı gereklidir.