30

SQL クエリの前にキーワード "explain" を付けると、いくつかの列を含むテーブルが得られます。「種類」欄とは何か教えてください。その文脈で何eq_refを意味し、何を意味するのか。ref

4

2 に答える 2

86

説明してみます...

eq_ref –2つのテーブルがあると想像してください。列(id、text)を含むテーブルA。idは主キーです。同じ列(id、text)を持つ表B。idは主キーです。表Aには次のデータがあります。

1, Hello 
2, How are

表Bには、次のデータがあります。

1, world!
2, you?

eq_refをAとBの間のJOINとして想像してみてください。

select A.text, B.text where A.ID = B.ID

このJOINは非常に高速です。これは、テーブルAでスキャンされた各行に対して、 JOIN条件を満たすテーブルBには1つの行しか存在できないためです。1つだけ。これは、B.idが一意であるためです。サーバー側での処理を示す擬似コード

foreach (rowA in A)
{
    if (existsInBRowWithID(rowA.id)
    {
        addToResult(rowA.text, getRowInBWithID(rowA.id).text);
    }
}

ref-ここで、列(id、text)を持つ別のテーブルCを想像してください。このテーブルでは、idはインデックスですが、一意ではありません。表Cには、次のデータがあります。

1, John!
1, Jack!

refをAとCの間のJOINとして想像してください。

select A.text, C.text where A.ID = C.ID

サーバー側の処理を示す擬似コード:

foreach (rowA in A)
{
    foreach (rowC in C)
    {
        if (rowA.id == rowC.id)
        {
            addToResult(rowA.text, rowC.text);
        }
    }
}

このJOINは、前のJOINほど高速ではありません。これは、テーブルAでスキャンされた各行について、 JOIN条件を満たす可能性のある行がテーブルCにいくつかあるためです(ネストされたループ)。これは、C.IDが一意ではないためです。

それがお役に立てば幸いです...

Cheerz!

于 2010-12-24T21:37:37.003 に答える
30

「タイプ」は、リクエストで作成された結合タイプを指します。最良のものから最悪のものまで、ここにリストがあります:

  • システム
  • 定数
  • eq_ref
  • 参照
  • 範囲
  • 索引
  • 全て

MySQL のドキュメントで、より詳細な説明を見つけることができます: http://dev.mysql.com/doc/refman/5.0/en/explain-output.html

于 2010-12-22T10:12:49.057 に答える