mysql - 如何正确索引多个左连接

标签 mysql

我有一个 SQL 查询:-

SELECT `challan` . * , `accounts`.`Name` AS `Account` , 
`accounts`.`AddLine1` , `accounts`.`AddLine2` , `accounts`.`TIN` , 
`accounts`.`PAN` , `accounts2`.`Name` AS `TempoName` , `items`.`Name` AS 
`Item` , `items`.`Units` , `items`.`SecondaryUnits` , 
`goods_received`.`Type` , `accounts3`.`Name` AS `Party`
FROM `challan`
LEFT JOIN `accounts` ON `challan`.`Account_Id` = `accounts`.`Id`
LEFT JOIN `accounts` AS `accounts2` ON `challan`.`TempoId` =`accounts2`.`Id`
LEFT JOIN `items` ON `challan`.`Item_Id` = `items`.`Id`
LEFT JOIN `goods_received` ON `challan`.`ItemGoodsReceivedId` = `goods_received`.`Id`
LEFT JOIN `accounts` AS `accounts3` ON `goods_received`.`AccountId` = `accounts3`.`Id`
WHERE `Challan_Id` = 'EBpzQD'

我想正确索引该查询,以便它运行得更快。我建议添加以下索引:-
accounts.Id(这是主键),
items.Id(这是主键),
goods_received.Id(这是主键),
challanAccount_Id
challanTempoId
challanItem_Id
goods_received.AccountId,
challanItemGoodsReceivedId
请告诉我我的方法是否正确,或者我必须添加更多索引。

最佳答案

前两个左连接和第五个左连接需要accounts.Id上的现有主键索引 - 您不需要添加新索引。

第三个联接需要 items.Id 上的现有主键索引 - 您不需要添加新索引。

第四个连接需要goods_received.Id上的现有主键索引 - 您不需要添加新索引。

您没有告诉我们 Challen_Id 列属于哪个表,但我假设它是 challen 表。该列还需要一个索引才能使 WHERE 子句高效。

您提到的其他索引对于此查询来说不是必需的。但是,确保每个外键都有一个索引(通常是非唯一的)始终是一种很好的做法。这避免了在删除或更新相应候选键时需要进行表扫描。如果您不这样做或者您的数据很小,您可能不需要它。

最后是风格上的一点。您不需要在任何这些名称周围使用反引号撇号,因为这些字符都不是特殊的。

关于mysql - 如何正确索引多个左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36539337/

相关文章:

mysql - 如何回退到 'WHERE' 子句 sql 中的不同值?

php - 过滤 MySQL 结果的最佳实践

mysql - 通过 if 语句重用 count

mysql - 移动 Feed 应用程序(如 Instagram、Twitter...)的服务器?

php mysql 循环内存泄漏?

PHP搜索mysql数据库

mysql - 由于对 schema_migrations 的唯一约束,Rails 单元测试失败

php - Wordpress 中的查询重写 - 删除自定义页面中的查询字符串

android - 从字典、内容提供者、Android 中获取单词

mysql - SQL从两个表中获取结果