Mysql Sorgu optimize

4 Cevap php

Işlevsellik bu tür için genel "en iyi uygulama" nedir.

Ben kullanıcıların anketler bir masa ve bir web sitesinde anket cevaplarının bir tablo, bir tablo var. Bir kullanıcı henüz cevap olmadığını bir anket yükleyen bir sayfa yüklemek istiyorum.

Bu konuda giderek en verimli ve "en iyi" yolu nedir.

Ben yavaş / optimum değil gibi görünüyor denedim şeyler:

NOT IN kullanarak iç içe seçer ile bir sorgu

SELECT p.id
FROM poll p
WHERE p.id NOT IN (
    SELECT r.pollID
    FROM responses r
    WHERE r.username = 'someuser'
)

Sol kullanan sorgu katıldı

LEFT JOIN  responses ON ( polls.id = responses.pollID
AND responses.username =  'someuser' ) 
WHERE
responses.username IS NULL

Bu çözümlerin her ikisi de çok kötü ölçekli görünüyor.

Diğer öneriler? Kutunun dışında herhangi bir şey için açın. (Mysql sorgu sadece farklı türlerine sınırlı değildir IE çözümler)

4 Cevap

Hem bu sorgular sürece responses (pollID, username) üzerine bir bileşik endeksi gibi aynı verimlilikle vardır

Lütfen sorguları yavaşsa, bu büyük olasılıkla bu dizin yok demektir.

LEFT JOIN IS NULL üzerinde kombine olmayan bir NULL sütun MySQL böylece tarafından optimize edilmiş en kısa sürede orada gördüğü gibi bir satır döndürür Sağ sütunda eşleşen hiçbir değer.

Sen EXPLAIN Extra sütunda Not exists olarak görebilirsiniz.

NOT IN Eğer EXPLAIN EXTENDED tarafından sağlanan uyarı mesajıyla <not exists> olarak görebilirsiniz, çok aynı şekilde optimize edilmiştir.

Daha fazla bilgi için benim blog bu girdiyi bakın:

Eğer pollID ve username üzerine responses bir bileşik anahtar verirsen sol katılması çok çalışması gerekir.

Sayısal bir kullanıcı kimliğine karşıt olarak, bir anahtar olarak bir kullanıcı adı kullanarak konum biraz üzücü olsa.

Çözüm # 1:

Bir düz yukarı sol Nasıl sizin için gerçekleştirmek katılmak nedir?

LEFT JOIN  responses ON ( polls.id = responses.pollID
AND responses.username =  'someuser' )

Tamam gerçekleştirir ise, sadece bu gibi anketler tam bir listesini almak ve daha sonra adı arayan kodu null değil satırları süzmek yapabilirsiniz.

Çözüm # 2:

Lütfen endeksleri Tamam emin olun. Siz yanıtları adınızı ann indeksi (veya anket ID + kullanıcı adı) sahip olmalıdır.

Ben bir Left burada en iyi bahis olacak katılın düşünüyorum. Ancak, ben bu null ise o zaman nerede maddesinde, bakın, sizin örnekte Eğer kullanıcı adınızı kontrol neden olarak karıştı. bu gibi görünmelidir:

LEFT JOIN  responses ON ( polls.id = responses.pollID) 
WHERE
responses.username = 'someuser'