有没有更好的方法来做这些MySQL查询?

问题描述:

目前我有三个不同的表格和三个不同的查询,它们几乎相同的连接非常相似。我试图在一个查询中结合所有这三个查询,但到目前为止还没有太多成功。如果有人有更好的解决方案或指向方向,我会很高兴。谢谢。有没有更好的方法来做这些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

这些实际上是三个非常不同的查询。我认为你不能将它们有效地结合起来。而且,他们对我来说似乎相当快。

但是,如果您想尝试优化每个单独的查询,则可以使用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) 。尽管如此,如果您已经优化了查询,那么可能应该通过使用分析或缓存查询结果来查找其他位置以在代码中进行优化。这取决于你使用的系统。担心大的优化,而不是小的优化。 –