2016-04-11 12 views
0

を結合します - それはより速く実行されるように、私はこのクエリ適切にインデックスを作成するどのように適切にインデックス複数の左に、私は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' 

を。私は次の項目にインデックスを追加することを提案します: -
accountsId(これは主キー)、
itemsです。 Id(これは主キー)、
goods_receivedです。 Id(これは主キーです)、
challanです。 Account_Id,
challanTempoId,
challanItem_Id,
goods_receivedAccountId,
challanItemGoodsReceivedId
私がアプローチに慣れているかどうか、またはインデックスを追加する必要があるかどうかを教えてください。

+0

達成したいデータ例と出力例を表示できますか? – keronconk

答えて

1

最初の2つの左結合と5番目の結合では、accounts.Idに既存の主キー索引が必要です。新しい索引を追加する必要はありません。

3回目の結合では、アイテムの既存の主キー索引が必要です。新しい索引を追加する必要はありません。

4回目の結合では、goods_received.Idに既存の主キー索引が必要です。新しい索引を追加する必要はありません。

あなたがChallen_Idの列がどのテーブルに属しているのかは教えていませんが、私はそれがChallenテーブルであると仮定します。この列には、効率的なWHERE句の索引も必要です。

他のインデックスは、このクエリには必要ありません。ただし、すべての外部キーに索引(通常は一意ではない)があることを確認することは、常に良い方法です。これにより、対応する候補キーを削除または更新するときにテーブルスキャンの必要性が回避されます。あなたがそれをしない、またはあなたのデータが小さい場合、あなたはそれが必要ではないかもしれません。

最後に、文章のポイント。文字のいずれも特別なものではないので、これらの名前のまわりでバックティックアポストロフィを使用する必要はありません。

+0

OPは\ 'id \ 'が\' goods_received \ 'のPRIMARY KEYであると指定しました。表の行が非常に長い場合は、表の一部に「索引をカバーする」を追加すると効果的です。 OPはどの索引が使用されているかを見るために、クエリ実行計画を見るのに 'EXPLAIN'を使うべきです。 – spencer7593

+0

そうです、私はそれを逃しました。私の答えを更新しました。ただし、索引をカバーする必要性は行サイズとは関係ありませんが、表の合計サイズとは関係ありません。私もそれを更新しました。 – cliffordheath

+0

カバー索引を使用すると、基礎となる表のページを検索せずに索引から問合せを満たすことができます。基になるテーブルの行が「大」の場合、ブロックあたりの行は少なくなります。カバリングインデックスにテーブル列のサブセットが含まれている場合、インデックスブロックあたりより多くの行が表示されます( – spencer7593

関連する問題