[英]what is the best way to optimize join query with multiple AND's?
我正在開發一個在線預訂系統,人們可以根據當天特定時段的可用性預訂項目。 為此,我使用兩個表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表示可用。
項目表中的可用性顯示該項目是否可用於預訂(可能已關閉以進行維修)。
首先是我的表結構很好嗎?其次,優化查詢的最佳方法是什么(多列索引等)。
謝謝,
拉維。
在你的FK上放一個外鍵約束和索引,這應該可以加快速度。 您似乎為項目ID混合了INT,為FK混合了MEDIUMINT,不確定這是大自然的意圖。
選擇要在其上創建索引的屬性時要記住的要點
SELECT列表和WHERE子句中經常使用的列。
一列,其中數據將按一系列值順序訪問。
將與GROUP By或ORDER BY子句一起使用的列,用於對數據進行排序。
連接中使用的列,例如FOREIGN KEY列。
用作PRIMERY KEY的列。
嘗試在數值上創建索引。 如果沒有數字pK,可以引入代理鍵。
為什么要將所有這些條件放在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專家是否會讓它更快,但對我來說它看起來更加明顯。
我建議在Reservation.item_id上創建一個索引。 這應該可以幫助您提高查詢性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.