Ne benim MySQL sorgusu nesi var?

3 Cevap php

Ben böyle sadece küçük bir performans sorunu gibi herhangi bir hata almıyorum.

EXPLAIN
SELECT
a.nid,
a.title,
a.uid,
b.parent,
b.weight,
c.name,
d.value
FROM table1 AS a INNER JOIN table2 AS b ON a.vid = b.vid AND a.status = 1
INNER JOIN table3 AS c ON c.uid = a.uid
INNER JOIN table4 AS d ON d.content_id = a.nid AND d.value_type = 'percent' AND d.function = 'average'

Ben tabloları başvurulan edildiği baktığımızda, her şey gayet iyi, ama sadece "değer" alanını seçerek gerektiğini Tablo 4'te, ben bir ALL çağrıldığını alıyorum ...

id  select_type 	table 	type 	  possible_keys 	                              key 	  key_len 	ref 	              rows 	Extra
1   SIMPLE 	        a 	  ref 	  PRIMARY,vid,status,uid,node_status_type,nid 	status 	4 	      const 	            1 	 
1   SIMPLE 	        b 	  eq_ref 	PRIMARY 	                                    PRIMARY 4 	      databasename.a.vid 	1 	 
1   SIMPLE 	        c 	  eq_ref 	PRIMARY 	                                    PRIMARY 4 	      databasename.a.uid 	1 	Using where
1   SIMPLE 	        d 	  ALL 	  NULL 	                                        NULL 	  NULL 	    NULL 	              2 	Using where

Gördüğünüz gibi, bu son tablo (d) 'den * seçerek oluyor. Ben sadece ondan seçilen ONE alanı gerektiğinde Neden bunu yapıyor? Herkes bana yardımcı olabilir misiniz?

3 Cevap

ALL tüm satırları, tüm sütunlar anlamına gelir. Hiçbir mümkün tuşları vardır diyor, ben seni d.content_id veya d.value_type veya d.function üzerinde bir dizin yok olduğunu tahmin ediyorum.

Eğer fantezi olmak istiyorsa, bu sütunların her 3 arasında bir dizin koyabilirsiniz.

D.value_type ve d.function alanları endeksli? İşte nedeni olarak ilk içgüdüsü olacaktır.

table4 content_type, value_type ve function sütunları dayalı bir çoklu-sütun dizin ekleyin.

Sorgunuz table4, tüm satırları seçerek oluyor tüm sütunları seçme değil; Sadece iki varken, bu kadar bir sorun değildir.

MySQL sorgu yürütme planı vermek size kayıtlarının küçük sayıda çalışırken beklemek cevap vermek olmayabilir unutmayın; Veritabanı bu durumlarda tam tablo taraması yapmak için daha hızlı olabilir.