【问题标题】:MYSQL best use of indexes for a JOIN queryMYSQL 对 JOIN 查询的最佳使用索引
【发布时间】: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)呢?在 titleprice 列上使用单独的索引对于第二个查询会更好

简单来说, 为了优化上述两个查询,这两个表上的索引的最佳用途是什么?

谢谢!

【问题讨论】:

  • ALTER TABLE locations ADD INDEX(location_name)(我想你的意思是locations table 而不是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


【解决方案1】:

对于表格位置,您可以使用 y .. 您可以使用单个复合

ALTER TABLE locations ADD locations_info INDEX(location_name , localtion_id)

使用带有 localtion_name 和 location_id 的组合,您可以确定 where (join) 子句所需的所有信息都由索引解析,避免访问数据表以获取 .. location_id

【讨论】:

  • 嗨,抱歉,出现问题,ALTER TABLE locations ADD INDEX(location_name) 而不是 ALTER TABLE homes_info ADD INDEX(location_name)
  • 更新你的问题..这样我才能正确回答..(发生)
  • 嗨,谢谢,但我还是很困惑,为什么我们需要在location_id 上使用索引,它是一个已经被索引的主键?那么第一个表呢,在第一个表的列上使用复合索引可以吗?你能解释一下吗
  • simple .. 使用复合索引 .. where 的信息都在同一个索引中 .. 因此,通过一次访问,您可以同时获得信息 .. 和查询优化器可以只使用一个索引查询中的表..在您的情况下,查询优化器使用带有主键的索引,但该索引没有名称信息,因此必须通过访问数据表来检索这部分信息...希望很清楚跨度>
  • 感谢您的解释,所以对于这个查询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, location_id) 所以实际上我们不需要担心JOIN,我们应该认为考虑到我们在连接查询中使用该表中的哪一列,我们应该如何在两个表上使用索引以获得最佳性能(单独)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多