Я попробую объяснение ...
eq_ref - представьте, что у вас есть две таблицы.Таблица A со столбцами (id, текст), где id является первичным ключом.Таблица B с теми же столбцами (id, текст), где id является первичным ключом.Таблица A содержит следующие данные:
1, Hello
2, How are
Таблица B содержит следующие данные:
1, world!
2, you?
Представьте eq_ref как JOIN между A и B:
select A.text, B.text where A.ID = B.ID
Это JOIN очень быстрое, потому что для каждой строки, отсканированной в таблице A, в таблице B может быть только ONE строка, которая удовлетворяет условию JOIN.Один и не более одного.Это потому, что Б.ид УНИКАЛЬНЫЙ.Вот вам псевдо код, который иллюстрирует обработку на стороне сервера:
foreach (rowA in A)
{
if (existsInBRowWithID(rowA.id)
{
addToResult(rowA.text, getRowInBWithID(rowA.id).text);
break;
}
}
ref - Теперь представьте другую таблицу C со столбцами (id, текст) вкоторый является индексом, но не УНИКАЛЬНЫМ.Таблица C содержит следующие данные:
1, John!
1, Jack!
Представьте ref как JOIN между 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);
}
}
}
Это СОЕДИНЕНИЕ не такое быстрое, как прежнее, потому что для каждой строки, отсканированной в таблице А, в таблице С есть НЕСКОЛЬКИХ возможных строк, которые могут удовлетворять условию СОЕДИНЕНИЯ (без прерывания вцикл выше).Это потому, что C.ID НЕ УНИКАЛЬНЫЙ.
Надеюсь, это поможет ...
Cheerz!