Php MySQL-需要更好的查询解决方案,极端负载时间

Php MySQL-需要更好的查询解决方案,极端负载时间,php,mysql,Php,Mysql,我有两张桌子->公寓和空房 在桌上公寓中,有关于公寓的所有信息。在表availabilities中,有关于未来365天公寓可用性的所有信息 餐桌公寓: 例如: 表可用性: 例如: 现在,我希望在多个日期范围内搜索一周的免费公寓,如: SELECT apartments where id in ( SELECT apartment_id FROM availabilities WHERE EXISTS ( SELECT apartment_id

我有两张桌子->公寓和空房

在桌上公寓中,有关于公寓的所有信息。在表availabilities中,有关于未来365天公寓可用性的所有信息

餐桌公寓:

例如:

表可用性:

例如:

现在,我希望在多个日期范围内搜索一周的免费公寓,如:

SELECT apartments where id in (
    SELECT apartment_id 
    FROM availabilities 
    WHERE EXISTS (
        SELECT apartment_id 
        FROM availabilities as a 
        WHERE availabilities.apartment_id = a.apartment_id 
        AND date >= "2017-06-01" 
        AND date < "2017-06-08" 
        AND status = "free" 
        GROUP BY apartment_id 
        HAVING COUNT(apartment_id) = DATEDIFF("2017-06-08", "2017-06-01")) 
    OR EXISTS (
        SELECT apartment_id 
        FROM availabilities as a 
        WHERE availabilities.apartment_id = a.apartment_id 
        AND date >= "2017-06-02" 
        AND date < "2017-06-09" 
        AND status = "free" 
        GROUP BY apartment_id HAVING COUNT(apartment_id) = DATEDIFF("2017-06-09", "2017-06-02"))`
这将查找2017-06-01-2017-06-30日期范围内一周的所有可能性

我的问题是,我们有很多公寓,这个查询有一个极端的加载时间


有更好的解决方案吗?

用COUNT*和filter for status=booked=0修复了它


查询速度提高了30%。

您能描述{Table_name}并解释{Your_Long_SQL_Query}并显示来自{Table_name}的索引并发布结果吗?将出现多少或存在的部分。。。28? 因为主查询没有使用此语法关闭?在01-08和02-09之后会有更多吗??由于2017-06-01-2017-06-30“描述和解释”的结果,我可以明天发布@Dimiyes@justonUndermillion整个范围内存在更多的部分吗?我会获取2017-06-01-2017-06-30和“免费”之间的所有行,然后用php完成其余部分。你每天都有一张桌子是很难的!假设10.000+个对象变成356*10000个条目,问题是你得到了公寓ID,但是你怎么知道日期范围/时间段是匹配的呢。最后一点:您能减少via到达/离开天数吗?
1, Apartment 1
2, Apartment 2
id, apartment_id, date, status
1, 1, 2017-06-01, free
2, 1, 2017-06-02, booked
3, 1, 2017-06-03, free
4, 1, 2017-06-04, free
5, 1, 2017-06-05, free
...
6, 2, 2017-06-05, free
7, 2, 2017-06-05, free
8, 2, 2017-06-05, free
9, 2, 2017-06-05, booked
10, 2, 2017-06-05, free
...
SELECT apartments where id in (
    SELECT apartment_id 
    FROM availabilities 
    WHERE EXISTS (
        SELECT apartment_id 
        FROM availabilities as a 
        WHERE availabilities.apartment_id = a.apartment_id 
        AND date >= "2017-06-01" 
        AND date < "2017-06-08" 
        AND status = "free" 
        GROUP BY apartment_id 
        HAVING COUNT(apartment_id) = DATEDIFF("2017-06-08", "2017-06-01")) 
    OR EXISTS (
        SELECT apartment_id 
        FROM availabilities as a 
        WHERE availabilities.apartment_id = a.apartment_id 
        AND date >= "2017-06-02" 
        AND date < "2017-06-09" 
        AND status = "free" 
        GROUP BY apartment_id HAVING COUNT(apartment_id) = DATEDIFF("2017-06-09", "2017-06-02"))`