0

restaurants構造 のテーブルと、構造 のテーブルがid, name, table_countありordersますrestaruant_id, start_date, end_date, status。ある日付範囲で利用可能なテーブルを見つけたい-利用可能なものとして-注文がないか、指定された日付範囲の確認済み予約(ステータス= 1)の数がテーブルの数よりも少ないと見なされますそのレストランを数えます。だから、私はこのクエリを使用します

SELECT r.id, r.name, r.table_count
FROM restaurants r
LEFT JOIN orders o 
ON r.id = o.restaurant_id 
WHERE o.id IS NULL 
OR (r.table_count > (SELECT COUNT(*) 
                FROM orders o2 
                WHERE o2.restaurant_id = r.id AND o2.status = 1 AND
                NOT(o.start_date >= '2013-09-10') AND NOT (o.end_date <= '2013-09-05')
            )
) 

それで、同じクエリを別の方法で作成できますか。私はこのように考えています。なぜなら、時間内に注文テーブルに数千行以上になる可能性があり、日付列をいくつかの日付範囲間で比較する必要があるため、列を追加すると結果が速くなるからですis_search(mysqlを使用) index) の値を 1 または 0 に設定します。これは cron ジョブによって更新でき、定期的にチェックして過去の予約を 0 として作成します。そのため、検索中に日付範囲 ( tinyint列を1または0で比較するよりもはるかに高価だと思います)。または、その条件を追加すると、チェックするものがもう1つ追加され、逆の効果がありますか?

ありがとう

4

1 に答える 1

0

0 と 1 でインデックスを作成することはお勧めできません。何千ものレコードがある場合、インデックスの選択性が低くなり、まったく使用されない可能性があります。

start_data と end_data に複合インデックスを作成すると、クエリを高速化できます。そして、日付列で not "NOT" 句を使用するようにクエリを書き直します。NOT は、インデックスを使用する代わりにテーブルの並べ替えを行うためです。

クエリします

...NOT(o.start_date >= '2013-09-10') AND NOT (o.end_date <= '2013-09-05')..

定義できた

...(o.start_date <'2013-09-10') AND (o.end_date > '2013-09-05')...

于 2013-08-24T20:29:07.597 に答える