Ben sadece aynı düzen ile birden fazla tablodan oluşan bir günlük sistemi kurduk.
Her veri kaynağı için bir tablo vardır.
Günlük görüntüleyici için şunu istiyorum
- BİRLİĞİ tüm günlük tabloları ,
- bunları hesaba göre filtreleyin ,
- kaynağın tanımlanması için sözde bir sütun ekleyin ,
- onları zamana göre sırala ,
- ve sayfalandırma için sınırlandırın .
Tüm tablolar, zeitpunktdizinlenmiş bir tarih / saat sütunu olarak adlandırılan bir alan içerir .
İlk denemem şuydu:
(SELECT l.id, l.account_id, l.vnum, l.count, l.preis, l.zeitpunkt AS zeit,
'hp' AS source FROM is_log AS l WHERE l.account_id = 730)
UNION
(SELECT l.id, l.account_id, l.vnum, l.count, l.preis, l.zeitpunkt,
'ig' AS source FROM ig_is_log AS l WHERE l.account_id = 730)
ORDER BY zeit DESC LIMIT 10;
Her iki tablodaki tüm satırlar alt sorgular tarafından döndürüldüğü ve UNION.
Geçici çözümüm şuydu:
(SELECT l.id, l.account_id, l.vnum, l.count, l.preis, l.zeitpunkt AS zeit,
'hp' AS source FROM is_log AS l WHERE l.account_id = 730
ORDER BY l.zeitpunkt DESC LIMIT 10)
UNION
(SELECT l.id, l.account_id, l.vnum, l.count, l.preis, l.zeitpunkt,
'ig' AS source FROM ig_is_log AS l WHERE l.account_id = 730
ORDER BY l.zeitpunkt DESC LIMIT 10)
ORDER BY zeit DESC LIMIT 10;
Ben her iki alt sorgu sıralanmış ve UNIONdaha sonra, daha sonra satırları birleştirir ve sıralar önce sınırlı olmalıdır sorgu motoru burada dizinleri kullanacağını bekliyordum .
Gerçekten bu olacağını düşündüm, ama EXPLAINsorgu üzerinde çalışan bana alt sorgu hala her iki tablo arama söylüyor.
EXPLAINingalt sorgular bana istenen optimizasyonu gösterir, ancak UNIONingbirlikte göstermez.
Bir şey mi kaçırdım?
Alt sorguların ORDER BYiçindeki cümlelerin UNIONa olmadan yoksayıldığını biliyorum LIMIT, ama bir sınır var.
Düzenleme:
Aslında, muhtemelenaccount_idkoşulolmadan sorguları olacaktır.
Tablolar zaten var ve verilerle dolu. Kaynağa bağlı olarak düzende değişiklikler olabilir, bu yüzden onları bölmek istiyorum. Ayrıca, günlüğe kaydetme istemcileri bir nedenle farklı kimlik bilgileri kullanır.
Günlük okuyucuları ve gerçek tablolar arasında bir tür katman tutmak zorundayım.
Tüm sorgunun ve ilk alt sorgunun yanı sıra tablo düzeninin ayrıntılı olarak yürütme planları şunlardır:
UNION DISTINCT? Ek tanımlama sütununa bağlı olarak sonuçlar alt sorgular arasında farklı olacağından, orada bir tür ve farklı zorlamaya gerek yoktur. Kullanın UNION ALL.
sourcesütun eklenmesi ile daha iyi olmaz mıydı ? Bu şekilde UNION, tüm verilerinizde s'den kaçınabilir ve dizin (ler) kullanabilirsiniz.
UNION ALLdeğişik yürütme planı sağlayıp sağlamadığını kontrol edin .
(account_id, zeitpunkt). Böyle bir endeksiniz var mı? İkinci en iyi(zeitpunkt)olanı (sanırım) tek olacaktır - ancak kullanılan verimlilik, satırların ne sıklıktaaccount_id=730göründüğüne bağlıdır .