【发布时间】:2019-02-12 21:36:14
【问题描述】:
我有两张桌子
homes_info 4 列
home_id (primary_key)
title (varchar)
price (double)
location_id (foreign key)
我还有一张桌子
locations 3 列
location_id (primary key)
location_name (varchar)
location_state (varchar)
我只想做这两个查询
SELECT * FROM homes_info WHERE title = 'xxxxx' && price = 'xxxx'
SELECT * FROM homes_info LEFT JOIN locations on homes_info.location_id = locations.location_id WHERE title = 'xxx' && price = 'xxxxx' && location_name = 'xxxx'
以下是使用上述表上的索引来优化上述两个查询的最佳方法吗?
ALTER TABLE homes_info ADD INDEX(title, price)
ALTER TABLE locations ADD INDEX(location_name)
我知道对于第一个查询,复合索引INDEX(title, price) 比单独的索引更好,但是第二个查询(我使用LEFT JOIN)呢?在 title 和 price 列上使用单独的索引对于第二个查询会更好
简单来说, 为了优化上述两个查询,这两个表上的索引的最佳用途是什么?
谢谢!
【问题讨论】:
-
ALTER TABLE locations ADD INDEX(location_name)(我想你的意思是locationstable 而不是home_info) -
@MadhurBhaiya 是的,你说得对,对不起,我现在正在编辑它
-
@user9050678,仅供参考,拇指规则是在 Where 子句和 Join 条件中包含的所有列上创建索引。由于您必须使用 2 个不同的查询,所以我建议在 (title, price) 上创建一个复合索引,并在 location_name 上创建一个不同的索引。 Location_id 已经有一个索引作为位置表的主键。
-
也许不完全是您正在寻找的东西,但是对于索引的顺序是否重要以及如何重要,有很多 SO 答案。就像 Ankit 所说,您的索引和 where/on 应该具有相同的字段;如果您想了解更细微的差异,这可以解释更多——stackoverflow.com/a/24315519/2430549
-
@AnkitBajpai 谢谢,我也是这么想的,但是 scaisEdge 的回答说的不一样,我会自己做更多的研究,然后在这里更新,谢谢
标签: mysql