0

我的数据库中有很长的选择,有很多连接。问题在于计算 SUM:没有 sum,选择时间约为 3 秒,但使用 SUM 约为 15 秒。

是否可以优化我的选择以获得更短的选择时间?

这是我的代码:

SELECT 
    accomodation.id, 
    accomodation.aid, 
    accomodation.title_en, 
    accomodation.title_url_en, 
    accomodation.address, 
    accomodation.zip, 
    accomodation.stars, 
    accomodation.picture, 
    accomodation.valid_from, 
    accomodation.valid_to, 
    accomodation.latitude, 
    accomodation.longitude, 
    accomodation.city_id AS 
    accomodation_city_id, 
    db_cities.id AS city_id, 
    db_cities.title_en AS city, 
    db_cities.title_url AS city_url, 
    db_countries.title_en AS country_title, 
    db_countries.title_url_en AS country_url, 
    accomodation_type.class AS accomodation_type_class, 
    accomodation_review_value_total.value AS review_total, 
    MIN(accomodation_price.price) AS price_from, 
    accomodation_rooms.total_persons 

FROM 
    (SELECT aid, MAX(info_date_add) AS max_info_date_add FROM accomodation GROUP BY aid) accomodation_max 

INNER JOIN accomodation 
    ON 
        accomodation_max.aid = accomodation.aid AND 
        accomodation_max.max_info_date_add = accomodation.info_date_add 

LEFT JOIN db_cities 
    ON ( 
        db_cities.id = accomodation.city_id OR 
        (((acos(sin((db_cities.latitude*pi()/180)) * sin((accomodation.latitude*pi()/180)) + cos((db_cities.latitude*pi()/180)) * cos((accomodation.latitude*pi()/180)) * cos(((db_cities.longitude - accomodation.longitude)*pi()/180))))*180/pi())*60*1.1515*1.609344) < '20') 

JOIN db_countries 
    ON db_countries.id = accomodation.country_id 

LEFT JOIN accomodation_review_value_total 
    ON accomodation_review_value_total.accomodation_aid = accomodation.aid 

LEFT JOIN accomodation_type_value 
    ON accomodation_type_value.accomodation_id = accomodation.id 

LEFT JOIN accomodation_type 
    ON accomodation_type.id = accomodation_type_value.accomodation_type_id 

JOIN accomodation_season 
    ON ( 
        accomodation_season.accomodation_aid = accomodation.aid AND 
        ( '2013-11-04' BETWEEN accomodation_season.start_date AND accomodation_season.end_date OR '2013-11-05' BETWEEN accomodation_season.start_date AND accomodation_season.end_date ) )

JOIN accomodation_price 
    ON 
        accomodation_price.accomodation_aid = accomodation.aid AND 
        accomodation_price.accomodation_price_type_id = '1' AND 
        accomodation_price.accomodation_price_cat_id = '1' AND 
        accomodation_price.price BETWEEN '20' AND '250' AND 
        accomodation_price.accomodation_season_id = accomodation_season.id 

JOIN accomodation_theme_value 
    ON accomodation_theme_value.accomodation_id = accomodation.id 

INNER JOIN 
    (SELECT 
        accomodation_id, 
        SUM(accomodation_rooms.rooms) AS total_rooms, 
        SUM(accomodation_rooms.beds * accomodation_rooms.rooms) AS total_persons 
    FROM accomodation_rooms 
    GROUP BY accomodation_id) accomodation_rooms 

    ON 
        accomodation_rooms.accomodation_id = accomodation.id AND 
        accomodation_rooms.total_persons >= '4' 

WHERE 
    db_countries.title_url_en LIKE '%spain%' AND 
    db_cities.title_url LIKE '%barcelona%' AND 
    accomodation_type_value.accomodation_type_id IN (5,10) AND 
    total_rooms >= '2' AND 
    accomodation_theme_value.accomodation_theme_id IN (11,12,13) AND 
    accomodation.stars IN (3,4,5) AND 
    ( accomodation_review_value_total.value >= '4.5' ) AND 
    db_cities.id = '2416' 

GROUP BY accomodation.aid 

ORDER BY 
    CASE 
        WHEN accomodation.valid_to>=NOW() AND accomodation.valid_from<=NOW() AND MIN(accomodation_price.price) IS NOT NULL THEN 0 
        WHEN NOW()>accomodation.valid_to AND accomodation.valid_to>'0000-00-00' AND MIN(accomodation_price.price) IS NOT NULL THEN 1 
        WHEN accomodation.valid_to>=NOW() AND accomodation.valid_from<=NOW() THEN 2 
        WHEN NOW()>accomodation.valid_to AND accomodation.valid_to>'0000-00-00' THEN 3 
    ELSE 4 END, 
    review_total DESC, 
    accomodation.title_en 

LIMIT 10
4

0 回答 0