sql - 需要一些帮助来优化复杂的 SQL 查询

标签 sql mysql database query-optimization

我想知道是否有人可以提供一些关于我如何优化这个 MySQL 查询的意见。我认为我对索引做了正确的事情,所以我不认为我可以更快地获得这个查询(目前运行时间超过 3 秒),但我真的很喜欢有更多经验的人来证明我错了。

这是查询:

SELECT `rooms`.*,
       ((IFNULL(SUM(av.host_daily_price), 0) + 
         rooms.host_daily_price * (4 - COUNT(DISTINCT av.id))) / 4) / 1 as 'price', 
       rooms.*, 
       (ACOS(least(1, COS(0.7115121627883911) * COS(1.291278129536698) *
                      COS(RADIANS(rooms.lat)) * COS(RADIANS(rooms.lng)) +
                      COS(0.7115121627883911) * SIN(-1.291278129536698) *
                      COS(RADIANS(rooms.lat)) * SIN(RADIANS(rooms.lng)) +
                      SIN(0.7115121627883911) * SIN(RADIANS(rooms.lat)))) * 3963.19) AS distance 
FROM `rooms`
LEFT JOIN availabilities AS av 
  ON (av.room_id = rooms.id AND
      av.date BETWEEN '2010-12-29' AND '2011-01-01')    
WHERE (rooms.deleted_at IS NULL) AND
      (`rooms`.`hidden` = 0) AND
      (rooms.id <> 7713) AND
      (rooms.city_id = 1 AND
         rooms.max_guests >= 4 AND
         rooms.minimum_stay <= 3 AND
         rooms.room_type IN ('room','apartment','house')) AND
      (av.inquiry_id IS NULL) 
GROUP BY  rooms.id 
HAVING SUM(IFNULL(status, 0)) = 0 AND
       (COUNT(*) = 4 OR `rooms`.default_available = 1) 
ORDER BY distance ASC
LIMIT 12;

解释的输出:

id  select_type table   type    possible_keys   key key_len ref rows    Extra

1   SIMPLE  rooms   ref PRIMARY,index_rooms_on_city_id,index_rooms_on_room_type,index_rooms_on_city_id_and_updated_at   index_rooms_on_city_id  5   const   2412    Using where; Using temporary; Using filesort

1   SIMPLE  av  ref index_availabilities_on_room_id,index_availabilities_on_room_id_and_date,index_availabilities_on_room_id_and_date_and_status    index_availabilities_on_room_id 5   roomorama.rooms.id  79  Using where

如果有其他有用的信息,请告诉我!

最佳答案

您应该认真考虑存储距离而不是计算它,特别是如果您按该值排序。

关于sql - 需要一些帮助来优化复杂的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3939519/

相关文章:

Mysql查询按部分获取最大年龄,如果两个或多个具有相同年龄,则返回具有最小id的学生

mysql每2天返回一次分组结果

mysql - Doctrine 的 left join 行为与普通 sql 不同

针对不同键的 mySQL 查询

mysql - SQL:如何在嵌套查询中获取表的大小

SQL 查询 : how do I change a value according to a lookup table?

sql - CoffeeScript,寻找类似 SQL 的模块

java - 监听从 PHP Web 服务访问的 MySQL 数据库中的更改

database - 在 CouchDB 中创建记录器?

android - 如何将 Android 应用程序数据持久保存到 Heroku 兼容的数据库中?