Bir BİRLİĞİ ile veya programlı iki MySQL sorguları Unite

3 Cevap php

Ben bir tabloya iki MySQL sorguları iki uç veri var. Her ikisi de aşağıdaki biçime sahip:

CREATE TABLE IF NOT EXISTS `data` (
`id` BIGINT NOT NULL AUTO_INCREMENT UNIQUE,
PRIMARY KEY (`id`)
)
SELECT `field1`, `field2`
WHERE `active` = 1

İki sorgular arasındaki tek fark nasıl field1 ve field2 belirlenir, ve şartlar Madde bazı küçük farklılıklar. Hem 12K ve daha kayıtlarına kadar çalıştırın.

Şimdi, daha verimli olacaktır:

Ayrı A. Run sorgular hem de:

if (mysql_query($query1)) {
    return mysql_query($query2);
}
return false;

B. VEYA BİRLİĞİ ile iki sorguları birleştirmek ve bir kez çalıştırın:

$query = 'SELECT `field1`, `field2` WHERE `active` = 1
            UNION 
            SELECT DO_ONE(`field1`), DO_TWO(`field2`) WHERE `active` = 1
            ORDER BY `field1`';
return mysql_query('CREATE TABLE IF NOT EXISTS `data` (
`id` BIGINT NOT NULL AUTO_INCREMENT UNIQUE,
PRIMARY KEY (`id`)
) ' . $query)

Bir sorgudan veri diğerinden veriler olmadan hiçbir işe yaramaz, bu yüzden ikisi de başarılı olmak gerekir. DO_ONE ve DO_TWO, bazı özelliklere göre alan verileri değiştirmek tanımlanmış MySQL fonksiyonları kullanıcı bulunmaktadır.

3 Cevap

Aaronmccall cevabı genel muhtemelen en iyisi - BİRLİĞİ yaklaşım bir SQL çağrısı hepsini yapar. Genelde o en "etkili" olacak, ancak devreye girer ve belirli bir uygulama için "verimli" bir ölçü etkileyebilecek yan sorunları olabilir.

Özellikle, BİRLİĞİ ara sonuçları toplamak için geçici bir tablo gerektirir ve yeni bir tabloya iki ayrı düz seçer yapıyor sonra, veri çok büyük setleri ile çalışıyorsanız sizin özel durumda daha verimli olmak dışarı çıkarmak olabilir. Bu veritabanı motoru içinde vb yapılabilir iç işleyişini, optimizasyonlar, (kullandığınız veritabanı motoru sürümüne bağlı olarak değişiklik olabilir) bağlı olacaktır.

Sonuçta, bu gibi böyle bir soruya sorunuzu cevaplamak için tek yol belirli uygulama ve çevre için zamanlamaları yapmak olabilir.

Ayrıca düşünebilirsiniz ki bir sorgu "hepsi bir arada" şeylerin büyük düzeni içinde önemsiz olabilir ... muhtemelen birkaç milisaniye fark bahsediyoruz (veya edilir vs iki ayrı sorgu için gerekli zaman arasındaki fark Hatta mikrosaniye?) MySQL veritabanı çok büyük gecikme sorunları ile ayrı bir sunucu üzerinde olmadıkça. Eğer tek seferde bu çağrıların binlerce yapıyorsanız, o zaman fark anlamlı olabilir, ama sadece birini veya bu çağrıların iki yapıyor ve eğer uygulama arasındaki fark, sonra başka şeyler yürütme zamanının% 99.99 harcama iki büyük olasılıkla bile fark olmayacaktır.

--- Lawrence

BİRLİĞİ yaklaşım kesinlikle bir vs php iki MySQL API çağrıları yapma pahasına nedeniyle daha hızlı olmalıdır.

Sizin seçenekleri farklı şeyler yapmak. İlk sorgu (bu döndüren sonuçlarının MEZUNLARI bağımsız olan, boş bir satır kümesi iade edilebilir) doğru yürütür eğer Birincisi ikinci sorgudan sonuçları döndürür. İkincisi ilk sorgu ve birlikte ikinci sorgudan sonuçları döndürür. İlk seçenek muhtemelen ne elde etmek istiyorum (seni missunderstood sürece) BİRLİĞİ ile ne yaptım, benim için oldukça yararsız görünüyor.

EDIT: Yorum okuduktan sonra, ben böyle bir şey sonra düşünüyorum:

Gerçek SEÇİN burada ((...) Field1, field2 SEÇİMİ VAR (field2, field1 SELECT ...) VE MEVCUT).

Bu şekilde daha iyi, bağlantı havuzundan daha az kaynak alır ve farklı bir sunucu DB motoru varsa gecikme etkisini iki katına değil ölçekler DB, tek bir sorgu var, ama yine de sorgu kesecektir ilk koşul iç içe ayrı sorgularla arıyor performans geliştirme, hangi başarısız olursa.

Bir optimizasyon olarak, durumda onlar aynı değildir, daha hızlı yürütülecek ilk koşulu var çalışın. Ben onlardan biri gerektiriyorsa bu alan hesapları yavaş olacağını varsayıyorum.