3


我正在开发一个在线预订系统,人们可以在其中根据一天中特定时间的可用性预订物品。为此,我使用了两个表 1.Item 2.Reservation

 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: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 子句中经常使用的列。
一列,其中的数据将按一系列值按顺序访问。
将与 GROUP By 或 ORDER BY 子句一起用于对数据进行排序的列。
连接中使用的列,例如 FOREIGN KEY 列。
用作主键的列。
尝试在数值上创建索引。如果没有数字 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 回答