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

标签 php mysql

我有 2 张 table -> 公寓和空房情况。

表公寓中包含有关公寓的所有信息。空房表中包含有关 future 365 天内公寓可用性的所有信息。

餐 table 公寓:

id, name

示例:

1, Apartment 1
2, Apartment 2


table 可用性:

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-06-01 - 2017-06-30)

我的问题是,我们有很多公寓,而这个查询的加载时间非常长。

有更好的解决方案吗?

最佳答案

使用 (COUNT(*) 和状态过滤器=“已预订”) = 0 修复了该问题

查询速度提高了 30%。

关于php - MySQL - 需要更好的查询解决方案,极端加载时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42768283/

相关文章:

php - 在 PHP 中生成任意长度的有序(加权)组合

php - 如何使用 preg_match 进行匹配

php - 使用 laravel 查询构建器构建查询

mysql - 没有索引的大数据分组

php - Ajax登录表单提交不起作用

php - AJAX 调用的自定义 PHP 错误

php - 如何只显示一级子类别?

php - 从 php 代码向 MySQL 数据库添加元素

php - 将推文合并到 MySQL 循环中

php - 带有变量的 MySQL UNIX_TIMESTAMP?