使用多个AND优化连接查询的最佳方法是什么?

时间:2012-06-11 13:16:21

标签: mysql sql sql-optimization


   我正在开发一个在线预订系统,人们可以根据当天特定时段的可用性预订项目。为此,我使用两个表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());

我正在使用上述查询显示特定类别下的所有项目以及用户可以在特定日期保留的免费时间段。

预订表中的

slot 字段包含字符串(例如: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 个答案:

答案 0 :(得分:2)

在你的FK上加上一个外键约束和索引,这应该可以加快速度。您似乎为项目ID混合了INT,为FK混合了MEDIUMINT,不确定这是大自然的意图。

答案 1 :(得分:2)

选择要创建索引的属性时要记住的要点

SELECT列表和WHERE子句中经常使用的列  一列,其中数据将按一系列值顺序访问  将与GROUP By或ORDER BY子句一起使用的列,用于对数据进行排序  连接中使用的列,例如FOREIGN KEY列  用作PRIMERY KEY的列  尝试在数值上创建索引。如果没有数字pK,可以引入代理键。

答案 2 :(得分: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专家是否会让它更快,但对我来说这看起来更明显。

答案 3 :(得分:0)

我建议在Reservation.item_id上创建一个索引。这应该可以帮助您提高查询性能。