你正在處理一個複雜的SQL方面。你可能想讀http://use-the-index-luke.com
恕我直言,你的發言
有日期範圍和屬性過濾器,但這些都是可選的
很可能讓你從我們這裏得到完全的任何意見除非您向我們展示這些過濾器的外觀,否則毫無價值。但是,我仍然會盡力提供幫助。
在units (unit_number, id)
和buildings(id,name)
上創建化合物covering indexes並查看性能是否提高。這些複合指標應該有助於業績。如果您在bookings.arrival
上過濾,那麼您也可以爲了同樣的目的在bookings (arrival, unit_number)
上創建複合索引。
在InnoDB中,將主鍵作爲複合索引的最後一列沒有意義; MySQL在每個索引中放置相應的對象。 在MyISAM你應該把PK放在那裏,如果你的查詢需要它。以主鍵開頭或包含它的複合索引仍然可能有用。
單列索引的集合無法達到與精心挑選的複合索引相同的目的。擁有大量索引會增加查詢計劃程序爲給定查詢找到有用的索引的機率。但是,覆蓋爲您的查詢設計的索引可以從根本上加快速度。
索引消耗的空間與其包含的數據量非常大致成正比。硬盤空間現在是驚人的便宜。
在你的Sql小提琴很顯然你應該改變你的units
表的索引。擺脫external_system_id
上的單列索引並將其替換爲該複合索引。
INDEX `units_joindex` (`external_system_id`, `building_id`)
像這樣:(http://sqlfiddle.com/#!9/e5ffd/2/0)。請注意,EXPLAIN
結果和查詢計劃在很大程度上取決於表中的行數和索引。像你這樣的查詢必然需要拉一張桌子,所以你不會在那裏看到很多索引。
如果你沒有使用'units'中的任何一列,爲什麼'join'? –
順便說一下,我在EXPLAIN前面加了SELECT,但它對我來說並不重要。 –
@vkp - 添加從建築物表中提取數據的最終查詢。 –