3

私は、私立保育所の小さな保護者向けのウェブサイトを構築しています。サイトの望ましい機能の 1 つは、ロケールの清掃を担当できる日を選択できるカレンダーを用意することです。今、私は仕事のカレンダーを作りました。目的に合わせて abit を変更した簡単なスクリプトをオンラインで見つけました。技術的にはうまく機能しますが、データベースから情報を抽出する方法を本当に変更する必要があるかどうか疑問に思い始めています。

カレンダーは毎月表示され、for ループを使用してテーブルとして描画されます。つまり、月によっては、ページが読み込まれるたびに for ループが 28 ~ 31 回実行されます。毎日の掃除の責任者を示すために、各メンバーの掃除日が保存されている MySQL データベースへの呼び出しを追加しました。擬似コードは次のようになります。

Draw table month
    for day=start_of_month to day=end_ofmonth
        type day
        select member from cleaning_schedule where picked_day=day
        type member

これは、ページをリロードするたびに、データベースに対して少なくとも 28 回の SELECT 呼び出しが行われることを意味します。私には、非効率的であり、DDOS 攻撃を受けやすい可能性があるように思えます。同じ結果を得るより効率的な方法はありますか? はるかに複雑な予約カレンダーがありますが、それらはどのように処理されますか?

4

5 に答える 5

5
SELECT picked_day, member FROM cleaning_schedule WHERE picked_day BETWEEN '2012-05-01' AND '2012-05-31' ORDER BY picked_day ASC

そのクエリの結果をループすることができます。各行には、日付の昇順で、選択した範囲の日付と人が含まれます。

于 2012-06-16T12:54:00.443 に答える
2

MySQL クエリ キャッシュはベーコンを保存します。

短いバージョン: 同じ SQL クエリを頻繁に繰り返すと、基になるテーブルが変更されていない限り、テーブル アクセスなしでサービスが提供されることになります。したがって、1 か月の最初の通話は約 1 か月になります。35 個の SQL クエリ。これは多すぎますが、多すぎません。同じページの 2 回目の読み込みでは、キャッシュから非常に高速に結果が返されます。

私の経験によると、たとえそれが可能であったとしても、これは派手な結合クエリを作成するよりもはるかに高速になる傾向があります.

于 2012-06-16T12:54:23.850 に答える
2

28回の呼び出しは大したことではありませんが、結合を使用して、1回のヒットで月全体のデータを呼び出します. その後、MySQL クエリの結果を配列であるかのように反復処理できます。

于 2012-06-16T13:14:07.280 に答える
1

SQL では、より大きなものとより小さなものを使用できます。したがって、1 日に 1 つの選択を行う代わりに、1 か月全体に対して 1 つの選択を記述することができます。

SELECT day, member FROM cleaning_schedule 
WHERE day >= :first_day_of_month AND day >= :last_day_of_month
ORDER BY day;

次に、1 日に複数のメンバーを処理するようにプログラムに注意を払う必要があります。プログラム ロジックはもう少し複雑になりますが、プログラムは高速になります。プロセス間またはネットワーク ベースの通信は、追加のロジックよりもはるかに遅くなります。

データ構造によっては、次のステートメントが可能で、より便利な場合があります。

SELECT day, group_concat(member) FROM cleaning_schedule 
WHERE day >= :first_day_of_month AND day >= :last_day_of_month
GROUP BY day
ORDER BY day;
于 2012-06-16T12:56:47.070 に答える
1

28 クエリは大規模な問題ではなく、ほとんどの商用 Web サイトではかなり一般的ですが、毎月のデータを 1 回のヒットで毎月取得することをお勧めします。次に、レコードを毎日ループします。

于 2012-06-16T12:58:37.880 に答える