Что означают типы eq_ref и ref в MySQL, объясните

Когда мы добавляем к SQL-запросу префикс ключевого слова «объяснить», мы получаем таблицу с несколькими столбцами. Скажите, пожалуйста, что такое столбец «тип». Что означают eq_ref и ref в этом контексте.


person Patruni Srikanth    schedule 22.12.2010    source источник


Ответы (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 НЕ УНИКАЛЬНЫЙ.

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

Привет!

person Lachezar Balev    schedule 24.12.2010
comment
идеальное объяснение! - person julestruong; 30.01.2017

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

  • система
  • константа
  • eq_ref
  • ссылка
  • диапазон
  • индекс
  • все

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

person Cyril N.    schedule 22.12.2010
comment
да, спасибо, но я не ищу это... я понял, что означают system и const в этом типе.... но что означают eq_ref и ref? Я прочитал объяснение в документации mysql, но не мог его понять.... - person Patruni Srikanth; 24.12.2010