2010-11-25 17 views
5
EXPLAIN SELECT node_id 
      FROM node 
     WHERE person_id IN (SELECT person_id 
           FROM user 
           WHERE is_locked = 0); 

MySql'de bulunan sonuçlar, alt sorgunun türetildiğini söylüyor. Ama değil!MySQL, alt sorguların, olmadığı zaman türetildiğini düşünüyor!

(Bu kolayca JOIN olarak yeniden yazılmış olabilir biliyorum ama MySQL bu bağımlı alt sorgu olduğunu düşündüğü neden bilmek istiyorum.)

+1

MySQL uzmanı değilim, ancak Stackoverflow durumundaki MySQL'in tam olarak bu durumda sorgu iyileştiricisinde kör bir noktaya sahip olan birkaç kişiyi okudum. –

+0

+1 MySQL bağımlı bir alt soruyu tespit etmekte gerçekten çok kötü ve bu konuda yapabileceğiniz hiçbir şey yok. – AndreKR

+1

Şartları anladığımda, alt-seçim türetilir (sonuçta elde edilen bir tablo sorgudan türetilir), ancak ilişkili değil (aynı zamanda alt sorgu herhangi bir veriyi kendi dışından kullanmaz), bağımlı olarak da bilinir. Bu, sadece bir kez çalıştırılmalı, satır başına bir kez değil anlamına gelir. – RedFilter

cevap

3

Bu MySQL Query Optimizer bir hata olduğunu. Alt sorgudaki tablo, ana sorgudaki tabloyla eşleşiyorsa, açıkçası olmamalı olsa bile bağımlı bir alt sorgu olarak kabul edilir ve kolay bir düzeltme yoktur. Afedersiniz; Katılmak için gidin.

+3

Bu gerçek bir utanç çünkü artık MySQL'in (ya da öncelikli olarak) kullanıcıların, özellikle de MySQL'in özellikle bir başarısızlığı olduğunda, bu yapıda doğal olarak performans göstermeyen bir şey olduğunu düşünen gazilyonlar var. –

+1

Sadece MySQL'in bu temel ve ciddi bir hata ile sürüm 5'e ulaşabileceğine zemin hazırlıyorum. – Sean

İlgili konular