2011-11-18 125 views
0

目前我有三個不同的表格和三個不同的查詢,它們幾乎相同的連接非常相似。我試圖在一個查詢中結合所有這三個查詢,但到目前爲止還沒有太多成功。如果有人有更好的解決方案或指向方向,我會很高興。謝謝。有沒有更好的方法來做這些MySQL查詢?

0.0013  
SELECT `ilan_genel`.`id`, `ilan_genel`.`durum`, `ilan_genel`.`kategori`, `ilan_genel`.`tip`, `ilan_genel`.`ozellik`, `ilan_genel`.`m2`, `ilan_genel`.`fiyat`, `ilan_genel`.`baslik`, `ilan_genel`.`ilce`, `ilan_genel`.`mahalle`, `ilan_genel`.`parabirimi`, `kgsim_ilceler`.`isim` as ilce, (
SELECT ilanresimler.resimlink 
FROM ilanresimler 
WHERE ilanresimler.ilanid = ilan_genel.id LIMIT 1 
) AS resim 
FROM (`ilan_genel`) 
LEFT JOIN `kgsim_ilceler` ON `kgsim_ilceler`.`id` = `ilan_genel`.`ilce` 
ORDER BY `id` desc 
LIMIT 30 
0.0006  
SELECT `video`.`id`, `video`.`url`, `ilan_genel`.`ilce`, `ilan_genel`.`tip`, `ilan_genel`.`m2`, `ilan_genel`.`ozellik`, `ilan_genel`.`fiyat`, `ilan_genel`.`parabirimi`, `ilan_genel`.`kullanici`, `ilanresimler`.`resimlink` as resim, `uyeler`.`isim` as isim, `uyeler`.`soyisim` as soyisim, `kgsim_ilceler`.`isim` as ilce 
FROM (`video`) 
LEFT JOIN `ilan_genel` ON `ilan_genel`.`id` = `video`.`id` 
LEFT JOIN `kgsim_ilceler` ON `kgsim_ilceler`.`id` = `ilan_genel`.`ilce` 
LEFT JOIN `ilanresimler` ON `ilanresimler`.`id` = `ilan_genel`.`resim` 
LEFT JOIN `uyeler` ON `uyeler`.`id` = `ilan_genel`.`kullanici` 
ORDER BY `siralama` desc 
LIMIT 30 
0.0005  
SELECT `sanaltur`.`id`, `ilan_genel`.`ilce`, `ilan_genel`.`tip`, `ilan_genel`.`m2`, `ilan_genel`.`ozellik`, `ilan_genel`.`fiyat`, `ilan_genel`.`parabirimi`, `ilan_genel`.`kullanici`, `ilanresimler`.`resimlink` as resim, `uyeler`.`isim` as isim, `uyeler`.`soyisim` as soyisim, `kgsim_ilceler`.`isim` as ilce 
FROM (`sanaltur`) 
LEFT JOIN `ilan_genel` ON `ilan_genel`.`id` = `sanaltur`.`id` 
LEFT JOIN `kgsim_ilceler` ON `kgsim_ilceler`.`id` = `ilan_genel`.`ilce` 
LEFT JOIN `ilanresimler` ON `ilanresimler`.`id` = `ilan_genel`.`resim` 
LEFT JOIN `uyeler` ON `uyeler`.`id` = `ilan_genel`.`kullanici` 
ORDER BY `siralama` desc 
LIMIT 30 
+0

使用'UNION'試過嗎? – 2011-11-18 10:33:18

+1

是不是太慢http://stackoverflow.com/questions/870080/why-are-union-queries-so-slow-in-mysql – motto

回答

3

這些實際上是三個非常不同的查詢。我認爲你不能將它們有效地結合起來。而且,他們對我來說似乎相當快。

但是,如果您想嘗試優化每個單獨的查詢,則可以使用EXPLAIN SELECT來了解每個查詢是否使用適當的索引。

例如:

EXPLAIN SELECT * 
FROM A 
WHERE foo NOT IN (1,4,5,6); 

可能產生:

+----+-------------+-------+------+--------------- 
| id | select_type | table | type | possible_keys 
+----+-------------+-------+------+--------------- 
| 1 | SIMPLE  | A  | ALL | NULL   
+----+-------------+-------+------+--------------- 

+------+---------+------+------+-------------+ 
| key | key_len | ref | rows | Extra  | 
+------+---------+------+------+-------------+ 
| NULL | NULL | NULL | 2 | Using where | 
+------+---------+------+------+-------------+ 

在這種情況下,查詢沒有possible_keys,因此沒有使用(或NULL)key做查詢。這是key列你們會有興趣在

點擊此處瞭解詳情:

+0

謝謝你的洞察力的答案,這是一個非常好的解釋。然而,我已經使用索引和查詢是快速的,但我想知道有沒有更好的方法來做到這一點。我不想每次發送3個不同的查詢到數據庫,並且聯合查詢在我看來似乎比原來的解決方案慢了一點。 – motto

+0

發送三個查詢沒什麼問題。如果它成爲問題,並且數據不必是新鮮的,那麼嘗試緩存結果。 –

+0

我能想到的使查詢稍快的唯一方法是使用[prepared statements](http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html) 。儘管如此,如果您已經優化了查詢,那麼可能應該通過使用分析或緩存查詢結果來查找其他位置以在代碼中進行優化。這取決於你使用的系統。擔心大的優化,而不是小的優化。 –

相關問題