2017-03-13 67 views
0

我有2個表 - >公寓和有效性。MySQL - 需要更好的查詢解決方案,極端加載時間

在表中的公寓大約有一個公寓的所有信息。在表格可用性中,有關於公寓在未來365天的可用性的所有信息。

表公寓:

id, name 

實施例:

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"))` 

這應該查找在某個日期範圍內的所有可能性一週( 2017年6月1日 - 2017年6月30日)

我的問題在這裏,我們得到了很多的公寓和這個查詢有一個極端的加載時間。

一個更好的解決方案的任何想法?

+1

可以做什麼'DESCRIBE {} table_name的'和'EXPLAIN {} Your_Long_SQL_QUERY'和'SHOW指數從{TABLE_NAME}'和後的結果? – Dimi

+0

有多少'OR EXISTS'部分會來...(28?),因爲主查詢沒有用這個語法關閉? '01 - 08'和'02 - 09'之後會有更多?由於'的2017年6月1日 - 解釋descripe的2017-06-30' – JustOnUnderMillions

+0

結果,我可以張貼明天@Dimi – Mario

回答

0

與(COUNT(*)和過濾器用於狀態= 「預訂」)= 0

查詢固定爲30%的速度。