有没有更好的方法来做这些 mysql 查询?
Posted
技术标签:
【中文标题】有没有更好的方法来做这些 mysql 查询?【英文标题】:is there better way to do these mysql queries? 【发布时间】:2011-11-18 10:23:49 【问题描述】:目前我有三个不同的表和三个不同的查询,它们彼此非常相似,具有几乎相同的连接。我试图将所有这三个查询与一个查询结合起来,但到目前为止没有太大的成功。如果有人有更好的解决方案或指向的方向,我会很高兴。谢谢。
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
【问题讨论】:
是不是太慢了***.com/questions/870080/… 【参考方案1】:这实际上是三个非常不同的查询。我认为您无法有效地将它们结合起来。而且,它们对我来说似乎很快。
但是,如果您想尝试优化每个单独的查询,您可以使用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
列。
更多信息在这里:
http://dev.mysql.com/doc/refman/5.5/en/explain.html http://dev.mysql.com/doc/refman/5.5/en/optimization-indexes.html【讨论】:
感谢您富有洞察力的回答,这是一个非常好的解释。但是,我已经在使用索引并且查询速度很快,但我想知道是否有更好的方法来做到这一点。我不想每次向数据库发送 3 个不同的查询,而且联合查询在我看来比原来的解决方案慢一点。 发送三个查询没有错。如果它成为一个问题,并且数据不必是新鲜的,那么请尝试缓存结果。 我能想到的使查询稍微快一点的唯一方法是使用prepared statements。尽管如此,如果您已经优化了查询,那么您可能应该通过使用分析或缓存查询结果来寻找其他地方在代码中进行优化。这取决于您使用的系统。担心大优化,而不是小优化。以上是关于有没有更好的方法来做这些 mysql 查询?的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 查询:有没有更好的方法来根据birth_date 日期字段获取 X 岁或以上的用户