我有一个 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
(这是主键),
challan
。Account_Id
,
challan
。TempoId
,
challan
。Item_Id
,
goods_received
.AccountId
,
challan
。ItemGoodsReceivedId
请告诉我我的方法是否正确,或者我必须添加更多索引。
最佳答案
前两个左连接和第五个左连接需要accounts.Id上的现有主键索引 - 您不需要添加新索引。
第三个联接需要 items.Id 上的现有主键索引 - 您不需要添加新索引。
第四个连接需要goods_received.Id上的现有主键索引 - 您不需要添加新索引。
您没有告诉我们 Challen_Id 列属于哪个表,但我假设它是 challen 表。该列还需要一个索引才能使 WHERE 子句高效。
您提到的其他索引对于此查询来说不是必需的。但是,确保每个外键都有一个索引(通常是非唯一的)始终是一种很好的做法。这避免了在删除或更新相应候选键时需要进行表扫描。如果您不这样做或者您的数据很小,您可能不需要它。
最后是风格上的一点。您不需要在任何这些名称周围使用反引号撇号,因为这些字符都不是特殊的。
关于mysql - 如何正确索引多个左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36539337/