2016-12-27 6 views
2

私はSQLで作業しており、プライマリキーのSQLテーブルに26000千のレコードがあります。JOINでのSQLクエリのパフォーマンス

従業員表のデータ:

Id | Name | DepartmentId 
    -------------------------- 
    1 | AA | 1 
    2 | BB | 1 
    3 | CC | 2 

Departmentsテーブルのデータ:Employee.DepartmentId

のインデックスを作成し

Id | Name  | 
---------------- 
1 | IT  | 
2 | Network | 

私は

、以下のようにクエリを持っています10
Select E.Id, E.Name, E.DepartmentId 
from Employees E 
JOIN Department D 
ON E.DepartmentId = D.Id 

上記のクエリは2秒後に実行され、すべてのレコードが返されます。 私は部門名を選択リストに含めたとき、10秒ほどで時間がかかります。

Select E.Id, E.Name, E.DepartmentId,D.Name 
from Employees E 
JOIN Department D 
ON E.DepartmentId = D.Id 

ここで問題は何ですか?

ありがとうございます。このクエリの

+2

互換性のないデータベースタグを削除しました。実際に使用しているデータベースに質問にタグを付けてください。 –

+0

は 'Employees'の' DepartmentId'がインデックスに登録されていますか?すべてのレコードを選択していることを忘れないでください.JSONで返されるデータは大きなサイズになり、データ転送のネットワーク速度も考慮する必要があります。 –

+1

**あなたの質問を編集し、実行計画を追加してください。 [_Formatted_](http://dba.stackexchange.com/help/formatting)テキスト、[スクリーンショットなし](http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload 285557#285557) –

答えて

1

select E.Id, E.Name, E.DepartmentId, D.Name 
from Employees E join 
    Department D 
    on E.DepartmentId = D.Id; 

最適なインデックスがDepartment(Id, Name)です。 Department(Id)がプライマリキーの場合は、本質的にこのインデックスを既に持っている可能性があります。

さらに重要な問題は、結果セットのサイズです。部門名は大きくなる場合があります(特に、varchar()ではなくchar()と宣言されている場合)。この問題は単に部門名のサイズである可能性があります。

1

Gordonのところで言及されているように、問題のインデックスを持つテーブルの結合ではなく、(追加のDepartment Nameの)結果セットに返されるデータの量ターミナルまたはgui。

また、MySQLでEXPLAINキーワードを使用して索引の問題を識別できるようにする必要があります。

関連する問題