3


一日の特定の時間帯の空き状況に応じて商品を予約できるオンライン予約システムを開発しています。そのために私は2つのテーブルを使用しています1.アイテム2.予約

 Item:(InnoDB)
 -------------------------
 id INT (PRIMARY)
 category_id MEDIUMINT
 name VARCHAR(20)
 make VARCHAR(20)
 availability ENUM('1','0')

 Reservation:(InnoDB)
 -------------------------
 id INT (PRIMARY)
 date DATE
 Item_id INT
 slot VARCHAR(50)

SELECT Item.id,Item.category,Item.make,Item.name,reservation.slot
FROM Item 
INNER JOIN reservation ON Item.id=reservation.Item_id AND Item.category_id=2
  AND Item.availability=1 AND reservation.date = DATE(NOW());

上記のクエリを使用して、特定のカテゴリのすべてのアイテムを、ユーザーが特定の日に予約できる無料のタイムスロットで表示しています。

予約テーブルのスロットフィールドに文字列が含まれています(例:0:1:1:1:0:0:0:0:0:0:0:1:1:1:0:0:0:0:0: 0:0:0:0)ここで、1は時間が予約されていることを意味し、0は利用可能であることを意味します。

アイテムテーブルの可用性は、アイテムが予約可能かどうかを示します(サービスのためにダウンしている可能性があります)。

まず第一に、私のテーブル構造は素晴らしいですか?第二に、私のクエリを最適化するための最良の方法は何ですか(複数列のインデックス作成など)。

ありがとう、
ラヴィ。

4

4 に答える 4

2

FKに外部キー制約とインデックスを設定します。これにより、処理速度が少し向上します。アイテムIDにINTを、FKにMEDIUMINTを混在させているように見えますが、これが自然の意図したものかどうかはわかりません。

于 2012-06-11T13:20:46.033 に答える
2

インデックスが作成される属性を選択する際に覚えておくべきポイント

SELECTリストおよびWHERE句で頻繁に使用される列。
値の範囲によってデータに順番にアクセスされる列。
データをソートするためにGROUPByまたはORDERBY句で使用される列。
FOREIGN KEY列など、結合で使用される列。
PRIMERYKEYとして使用される列。
数値にインデックスを作成してみてください。数値のpKがない場合は、代理キーを導入できます。

于 2012-06-11T13:21:24.443 に答える
0

なぜこれらすべての条件をjoin句に入れるのですか?なぜだめですか:

SELECT Item.id,Item.category,Item.make,Item.name,reservation.slot
FROM Item INNER JOIN reservation ON Item.id=reservation.Item_id
WHERE Item.category_id=2 AND Item.availability=1 AND reservation.date = DATE(NOW());

SQLの専門家では、これで高速化できるかどうかを判断するのに十分ではありませんが、私にはもっと明白に見えます。

于 2012-06-11T13:21:16.757 に答える
0

Reservation.item_id にインデックスを作成することをお勧めします。これにより、クエリのパフォーマンスが向上するはずです。

于 2012-06-11T13:39:41.527 に答える