1

この単純な結合はうまく機能しますが、技術テーブルが非常に大きいため、恐ろしく遅いと思います。uid のタイムスタンプを追跡するため、uid には多くのインスタンスがあり、したがって個別です。このクエリを高速化する最善の方法は何ですか?

SELECT DISTINCT tech.uid, 
                listing.empno, 
                listing.firstname, 
                listing.lastname 
FROM   tech, 
       listing 
WHERE  tech.uid = listing.empno 
ORDER  BY listing.empno ASC 
4

2 に答える 2

4

最初に、それぞれのテーブルの tech.UID と listing.EmpNo にインデックスを追加します。インデックスがあることを確認したら、次のようにクエリを書き直してみてください。

SELECT DISTINCT tech.uid, listing.EmpNo, listing.FirstName, listing.LastName
FROM  listing INNER JOIN tech ON tech.uid = listing.EmpNo
ORDER BY listing.EmpNo ASC;

それでも十分に高速でない場合は、クエリの前に EXPLAIN という単語を追加して、クエリの実行計画に関するヒントを取得します。

EXPLAIN SELECT DISTINCT tech.uid, listing.EmpNo, listing.FirstName, listing.LastName
    FROM  listing INNER JOIN tech ON tech.uid = listing.EmpNo
    ORDER BY listing.EmpNo ASC;

より良い洞察を得ることができるように、Explain の結果を投稿します。

それが役に立てば幸い、

于 2013-02-28T20:53:17.890 に答える
1
  1. これは非常に単純なクエリです。SQL でできる唯一のこと -インデックスがない場合、JOIN/WHERE および ORDER BY 句 (tech.uid、listing.empno) で使用されるフィールドにインデックスを追加できます。

  2. JOIN値を持つフィールドがある場合NULL、パフォーマンスが損なわれる可能性があります。WHERE句 ( )でそれらをフィルタリングする必要がありますWHERE tech.uid is not null and listing.empno not nullJOINonフィールドの行が多数ある場合NULL、そのデータはデカルト結果を生成する可能性があり (これが英語でどのように呼ばれているかはわかりません)、膨大な数の行が含まれる可能性があります。

  3. MySQL の構成を変更できます。key_buffer_size、sort_buffer_size、tmp_table_size、max_heap_table_size、read_buffer_size など、パフォーマンス チューニングに役立つ多くのオプションがあります。

于 2013-02-28T20:56:05.567 に答える