sql >> データベース >  >> RDS >> Mysql

MySQL(およびPHP)で可用性を探していますか?

    うまくいくと思われる解決策は次のとおりです。

    SELECT t.*, DATEDIFF(t.LatestAvailable, t.EarliestAvailable) AS LengthAvailable
    FROM 
       (SELECT u.*,
          COALESCE(b1.End, @StartOfWindow) AS EarliestAvailable,
          COALESCE(b2.Start, @EndOfWindow) AS LatestAvailable
        FROM LettingUnits u
        LEFT OUTER JOIN LettingUnitBookings b1
          ON (u.ID = b1.F_LU_ID AND b1.End BETWEEN @StartOfWindow AND @EndOfWindow)
        LEFT OUTER JOIN LettingUnitBookings b2
          ON (u.ID = b2.F_LU_ID AND b2.Start BETWEEN @StartOfWindow AND @EndOfWindow
              AND b2.Start >= b1.End) -- edit: new term
        ) AS t
    LEFT OUTER JOIN LettingUnitBookings x
      ON (t.ID = x.F_LU_ID AND x.Start < t.LatestAvailable AND x.End > t.EarliestAvailable)
    WHERE x.ID IS NULL AND DATEDIFF(t.LatestAvailable, t.EarliestAvailable) >= @WindowSize;
    

    出力は次のとおりです。

    +-----+-------------+-------------------+-----------------+-----------------+
    | ID  | Name        | EarliestAvailable | LatestAvailable | LengthAvailable |
    +-----+-------------+-------------------+-----------------+-----------------+
    | 123 | Foo Cottage | 2009-01-05        | 2009-01-10      |               5 |
    | 123 | Foo Cottage | 2009-01-20        | 2009-01-25      |               5 |
    | 456 | Bar Cottage | 2009-01-20        | 2009-01-31      |              11 |
    +-----+-------------+-------------------+-----------------+-----------------+
    

    EXPLAINでこれを分析する インデックスをかなりうまく採用していることを示しています:

    +----+-------------+------------+--------+---------------+---------+---------+-------+------+-------------------------+
    | id | select_type | table      | type   | possible_keys | key     | key_len | ref   | rows | Extra                   |
    +----+-------------+------------+--------+---------------+---------+---------+-------+------+-------------------------+
    |  1 | PRIMARY     | <derived2> | ALL    | NULL          | NULL    | NULL    | NULL  |    9 | Using where             |
    |  1 | PRIMARY     | x          | ref    | F_LU_ID       | F_LU_ID | 8       | t.ID  |    2 | Using where; Not exists |
    |  2 | DERIVED     | u          | system | NULL          | NULL    | NULL    | NULL  |    1 |                         |
    |  2 | DERIVED     | b1         | ref    | F_LU_ID       | F_LU_ID | 8       | const |    0 |                         |
    |  2 | DERIVED     | b2         | ref    | F_LU_ID       | F_LU_ID | 8       | const |    0 |                         |
    +----+-------------+------------+--------+---------------+---------+---------+-------+------+-------------------------+
    

    EXPLAINと比較してください ソリューションのレポート与えられた @martinclaytonによる:

    +----+--------------+---------------------+--------+---------------+---------+---------+------+------+---------------------------------+
    | id | select_type  | table               | type   | possible_keys | key     | key_len | ref  | rows | Extra                           |
    +----+--------------+---------------------+--------+---------------+---------+---------+------+------+---------------------------------+
    |  1 | PRIMARY      | lu                  | system | PRIMARY,ID    | NULL    | NULL    | NULL |    1 |                                 |
    |  1 | PRIMARY      | <derived2>          | ALL    | NULL          | NULL    | NULL    | NULL |    4 | Using where                     |
    |  2 | DERIVED      | <derived3>          | ALL    | NULL          | NULL    | NULL    | NULL |    4 | Using temporary; Using filesort |
    |  2 | DERIVED      | <derived5>          | ALL    | NULL          | NULL    | NULL    | NULL |    4 | Using where; Using join buffer  |
    |  5 | DERIVED      | LettingUnitBookings | ALL    | NULL          | NULL    | NULL    | NULL |    3 |                                 |
    |  6 | UNION        | LettingUnitBookings | index  | NULL          | F_LU_ID | 8       | NULL |    3 | Using index                     |
    | NULL | UNION RESULT | <union5,6>          | ALL    | NULL          | NULL    | NULL    | NULL | NULL |                                 |
    |  3 | DERIVED      | LettingUnitBookings | ALL    | NULL          | NULL    | NULL    | NULL |    3 |                                 |
    |  4 | UNION        | LettingUnitBookings | index  | NULL          | F_LU_ID | 8       | NULL |    3 | Using index                     |
    | NULL | UNION RESULT | <union3,4>          | ALL    | NULL          | NULL    | NULL    | NULL | NULL |                                 |
    +----+--------------+---------------------+--------+---------------+---------+---------+------+------+---------------------------------+
    

    一般に、Using filesortを強制する最適化計画は避けたいと考えています。 またはUsing temporary これらはパフォーマンスキラーだからです。 GROUP BYを使用したクエリ 少なくともMySQLでは、この種の最適化を引き起こすことはほぼ確実です。



    1. SQLServerでのユーザーとログインの違い

    2. T-SQLで日付順に並べ替える方法

    3. xamppでmysqlバージョンを更新する方法(innodb_additional_mem_pool_sizeのエラー)

    4. SubSonic 3およびMySQL、CleanUp()メソッドの列名からアンダースコアを削除すると、linq-queryでプロパティを使用するときに例外が発生します