Что означает EQ ref и ref типы в MySQL объяснить

когда мы префикс SQL-запроса с ключевым словом "explain" мы получаем таблицу с некоторыми столбцами. Пожалуйста, скажите мне, что такое столбец "тип". Что делает eq_ref и ref значит в этом контексте.

2 ответов


Я попробую объяснить...

eq_ref – представьте, что у вас две таблицы. Таблица A со столбцами (id, text), где id является первичным ключом. Таблица B с теми же столбцами (id, text), где id является первичным ключом. Таблица А содержит следующие данные:

1, Hello 
2, How are

таблица B содержит следующие данные:

1, world!
2, you?

представьте eq_ref как соединение между A и B:

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

это соединение очень быстро, потому что для каждой строки, отсканированной в таблице A можно только один строка в таблице B, которая удовлетворяет условию соединения. Один и не более одного. Это потому, что B. id уникален. Вот вам псевдо код, который иллюстрирует обработку на стороне сервера:

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

ref - теперь представьте другую таблицу C со столбцами (id, text), в которой id-индекс, но не уникальный. Таблица C содержит следующие сведения:

1, John!
1, Jack!

представьте ref как соединение между A и C:

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);
        }
    }

}

это соединение не так быстро, как предыдущее, потому что для каждой строки, отсканированной в таблице A, есть несколько возможные строки в таблице C, которые могут удовлетворять условию соединения (без разрыва в цикле выше). Это потому, что C. ID не уникален.

надеюсь, это поможет...

Cheerz!


"тип" относится к типу соединения, сделанному в вашем запросе. От лучшего к худшему, вот список :

  • система
  • const
  • eq_ref
  • ref
  • ряд
  • индекс
  • все

вы найдете более подробное объяснение в документации MySQL:http://dev.mysql.com/doc/refman/5.0/en/explain-output.html