2013-06-27 23 views
1

我有一個查詢。我爲所有連接的鍵創建了索引,預過濾主表並選擇特定的行進行選擇,但顯示(有時會掛起)仍需要很長時間。我們應該做什麼來提高績效?從多個主表提高查詢性能

SELECT * 
FROM t_responden a 
     INNER JOIN t_kepemilikan_tik b 
       ON a.res_id = b.res_id 
     INNER JOIN t_televisi c 
       ON a.res_id = c.res_id 
     INNER JOIN t_telepon_hp d 
       ON a.res_id = d.res_id 
     INNER JOIN t_radio e 
       ON a.res_id = e.res_id 
     INNER JOIN t_media_cetak f 
       ON a.res_id = f.res_id 
     INNER JOIN t_internet g 
       ON a.res_id = g.res_id 
     LEFT JOIN t_mst_pendidikan n 
       ON a.res_pendidikan_kk = n.kd_pendidikan 
     LEFT JOIN t_mst_pendidikan o 
       ON a.res_pendidikan = o.kd_pendidikan 
     LEFT JOIN t_mst_penghasilan p 
       ON a.res_penghasilan = p.kd_penghasilan 

     LEFT JOIN t_mst_aksesibilitas q 
       ON a.res_aksesibilitas = q.kd_akses 
     LEFT JOIN t_mst_mobilitas r 
       ON a.res_mobilitas = r.kd_mobilitas 
     LEFT JOIN t_mst_pekerjaan s 
       ON a.res_pekerjaan = s.kode 
     LEFT JOIN t_mst_pengeluaran t 
       ON a.res_pengeluaran = t.kode 

     INNER JOIN t_pernyataan h 
       ON a.res_id = h.res_id 

     INNER JOIN (SELECT * FROM t_mst_prop WHERE kode IN ('3200', '1600', '1800', '3600')) i 
       ON a.res_propinsi = i.kode 

     INNER JOIN (SELECT * FROM t_mst_kabkota WHERE kode_prop IN ('3200', '1600', '1800', '3600')) j 
       ON (a.res_kabkota = j.kode 
        AND a.res_propinsi = j.kode_prop) 

     INNER JOIN (SELECT * FROM t_mst_kec WHERE kode_prop IN ('3200', '1600', '1800', '3600')) k 
       ON (a.res_kecamatan = k.kode 
        AND a.res_kabkota = k.kode_kabkota 
        AND a.res_propinsi = k.kode_prop) 

     INNER JOIN (SELECT * FROM t_mst_desa WHERE kode_prop IN ('3200', '1600', '1800', '3600'))l 
       ON (a.res_keldesa = l.kode 
        AND a.res_kabkota = l.kode_kabkota 
        AND a.res_propinsi = l.kode_prop 
        AND l.kode_kec = a.res_kecamatan) 

WHERE a.res_tahunsurvei = 2013 
     AND res_propinsi IN ('3200', '1600', '1800', '3600') 
ORDER BY 1 
+0

的解釋說,關於這個查詢的表? – medina

回答

1
SELECT STRAIGHT_JOIN 
     * 
    FROM 
     t_responden a 
     INNER JOIN t_kepemilikan_tik b 
      ON a.res_id = b.res_id 
     INNER JOIN t_televisi c 
      ON a.res_id = c.res_id 
     INNER JOIN t_telepon_hp d 
      ON a.res_id = d.res_id 
     INNER JOIN t_radio e 
      ON a.res_id = e.res_id 
     INNER JOIN t_media_cetak f 
      ON a.res_id = f.res_id 
     INNER JOIN t_internet g 
      ON a.res_id = g.res_id 
     LEFT JOIN t_mst_pendidikan n 
      ON a.res_pendidikan_kk = n.kd_pendidikan 
     LEFT JOIN t_mst_pendidikan o 
      ON a.res_pendidikan = o.kd_pendidikan 
     LEFT JOIN t_mst_penghasilan p 
      ON a.res_penghasilan = p.kd_penghasilan 
     LEFT JOIN t_mst_aksesibilitas q 
      ON a.res_aksesibilitas = q.kd_akses 
     LEFT JOIN t_mst_mobilitas r 
      ON a.res_mobilitas = r.kd_mobilitas 
     LEFT JOIN t_mst_pekerjaan s 
      ON a.res_pekerjaan = s.kode 
     LEFT JOIN t_mst_pengeluaran t 
      ON a.res_pengeluaran = t.kode 
     INNER JOIN t_pernyataan h 
      ON a.res_id = h.res_id 

     INNER JOIN t_mst_prop i 
      ON a.res_propinsi = i.kode 
     INNER JOIN t_mst_kabkota j 
       ON a.res_propinsi = j.kode_prop 
       AND a.res_kabkota = j.kode 
     INNER JOIN t_mst_kec k 
       ON a.res_propinsi = k.kode_prop 
       AND a.res_kecamatan = k.kode 
       AND a.res_kabkota = k.kode_kabkota 
     INNER JOIN t_mst_desa l 
       ON a.res_propinsi = l.kode_prop 
       AND a.res_keldesa = l.kode 
       AND a.res_kabkota = l.kode_kabkota 
       AND a.res_kecamatan = l.kode_kec 
    WHERE 
      a.res_tahunsurvei = 2013 
     AND a.res_propinsi IN ('3200', '1600', '1800', '3600') 
    ORDER BY 
     1 

你應該有(res_tahunsurvei,res_propinsi)您t_responden表上的索引,以配合您哪裏資格標準。此外,所有內部加入其他表格的地方,您通過子選擇應用IN的其他表格正在讓您失望。你已經在限制「kode」在哪裏,所以如果你將它作爲你的加入,你應該是好的。

此外,由於所有其他表顯得更「查找」,我已經添加了「STRAIGHT_JOIN」來告訴MySQL中,以便查詢您列出

+0

太棒了! 「STRAIGHT_JOIN」會影響結果嗎? –

+0

@WildanMuhlis,什麼是vs什麼是新的表現第一,然後我可以爲你澄清。 – DRapp

+0

查詢只用了'0.0188秒 –