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, zeitpunkt
dizinlenmiş 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 UNION
daha 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 EXPLAIN
sorgu üzerinde çalışan bana alt sorgu hala her iki tablo arama söylüyor.
EXPLAINing
alt sorgular bana istenen optimizasyonu gösterir, ancak UNIONing
birlikte göstermez.
Bir şey mi kaçırdım?
Alt sorguların ORDER BY
içindeki cümlelerin UNION
a olmadan yoksayıldığını biliyorum LIMIT
, ama bir sınır var.
Düzenleme:
Aslında, muhtemelenaccount_id
koş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
.
source
sütun eklenmesi ile daha iyi olmaz mıydı ? Bu şekilde UNION
, tüm verilerinizde s'den kaçınabilir ve dizin (ler) kullanabilirsiniz.
UNION ALL
değ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=730
göründüğüne bağlıdır .