mysql - MYSQL 对 JOIN 查询的最佳使用索引
问题描述
我有两张桌子
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
简而言之,这两个表上的索引对于优化上述两个查询的最佳用途是什么?
谢谢!
解决方案
对于表位置,您可以使用 y .. 您可以使用单个复合
ALTER TABLE locations ADD locations_info INDEX(location_name , localtion_id)
使用带有 localtion_name 和 location_id 的组合,您可以确定 where (join) 子句所需的所有信息都由索引解析,避免访问数据表以获取 .. location_id
推荐阅读
- ios - 选择要构建的 iOS 版本
- vue.js - 如何创建带有导航抽屉和可调整大小内容的 Vuetify 容器?
- python - Pandas:如何计算一列的滚动窗口(按日期分组)并计算另一列的不同值?
- firebase - 为什么我通过简单的 Firebase 发布请求获得权限被拒绝 401 - Firebase 安全规则 - REST API
- go - 在 DDD 中,一个实体和存储库可以从多个表中提取吗?
- html - 引导程序 v4.4 | 折叠 - 过渡不起作用
- dynamics-crm - Dynamics365CE 工作流程:检查值是否已存在并更新记录
- javascript - 用 morris.js 放多行
- node.js - 如何使用 child_process 在相同和不同的终端上运行命令?
- django - 有没有办法在运行时生成 SearchVector 字段内容?