Когда мы добавляем к SQL-запросу префикс ключевого слова «объяснить», мы получаем таблицу с несколькими столбцами. Скажите, пожалуйста, что такое столбец «тип». Что означают eq_ref
и ref
в этом контексте.
Что означают типы eq_ref и ref в MySQL, объясните
Ответы (2)
попробую объяснить...
eq_ref — представьте, что у вас есть две таблицы. Таблица A со столбцами (идентификатор, текст), где идентификатор является первичным ключом. Таблица B с теми же столбцами (идентификатор, текст), где идентификатор является первичным ключом. Таблица А имеет следующие данные:
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, удовлетворяющая условию JOIN. Один и не более одного. Это потому, что B.id УНИКАЛЬНЫЙ.
Вот вам: псевдокод, который иллюстрирует обработку на стороне сервера:
foreach (rowA in A)
{
if (existsInBRowWithID(rowA.id)
{
addToResult(rowA.text, getRowInBWithID(rowA.id).text);
}
}
ref. Теперь представьте другую таблицу C со столбцами (идентификатор, текст), в которых идентификатор является индексом, но не УНИКАЛЬНЫМ. Таблица 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 НЕ УНИКАЛЬНЫЙ.
Надеюсь, это поможет...
Привет!
«Тип» относится к типу соединения, указанному в вашем запросе. От лучшего к худшему, вот список:
- система
- константа
- eq_ref
- ссылка
- диапазон
- индекс
- все
Вы найдете более подробное объяснение в документации MySQL: http://dev.mysql.com/doc/refman/5.0/en/explain-output.html