有没有更好的方法来做这些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
这些实际上是三个非常不同的查询。我认为你不能将它们有效地结合起来。而且,他们对我来说似乎相当快。
但是,如果您想尝试优化每个单独的查询,则可以使用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
列你们会有兴趣在
点击此处了解详情:
谢谢你的洞察力的答案,这是一个非常好的解释。然而,我已经使用索引和查询是快速的,但我想知道有没有更好的方法来做到这一点。我不想每次发送3个不同的查询到数据库,并且联合查询在我看来似乎比原来的解决方案慢了一点。 – motto
发送三个查询没什么问题。如果它成为问题,并且数据不必是新鲜的,那么尝试缓存结果。 –
我能想到的使查询稍快的唯一方法是使用[prepared statements](http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html) 。尽管如此,如果您已经优化了查询,那么可能应该通过使用分析或缓存查询结果来查找其他位置以在代码中进行优化。这取决于你使用的系统。担心大的优化,而不是小的优化。 –
使用'UNION'试过吗? – 2011-11-18 10:33:18
是不是太慢http://stackoverflow.com/questions/870080/why-are-union-queries-so-slow-in-mysql – motto