понимание MySQL Объяснить вывод

У меня есть пара вопросов, касающихся объяснения MySQL.

  1. На первом этапе оценки используется REF для типа соединения. Однако, после моего исследования ref, он утверждает следующее: All rows with matching index values are read from this table for each combination of rows from the previous tables. Что это за предыдущая таблица? Как может быть предыдущая таблица, если это начальный шаг?
  2. Я создал индекс для SE, почему в столбце Extra указано Using where? вместо Using Index? И в нем конкретно указано, что он использует индекс, просматривая KEY column : SE
  3. С точки зрения порядка операций, выполняет ли MySQL все процессы в этом порядке? SE = 5 с использованием индекса, R.Rid = S.Rid с использованием записей из предыдущего шага, R.B = 5 с использованием записей из предыдущего шага?

ИНДЕКС на SE

mysql> Create index SE on S(E);
Query OK, 0 rows affected (1.15 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> explain SELECT COUNT(R.RID) FROM R, S WHERE R.RID=S.RID AND R.B=5 AND S.E=5;
+----+-------------+-------+--------+---------------+---------+---------+----------------+------+-------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref            | rows | Extra       |
+----+-------------+-------+--------+---------------+---------+---------+----------------+------+-------------+
|  1 | SIMPLE      | S     | ref    | RID,SE        | SE      | 5       | const          |    6 | Using where |
|  1 | SIMPLE      | R     | eq_ref | PRIMARY       | PRIMARY | 4       | project2.S.RID |    1 | Using where |
+----+-------------+-------+--------+---------------+---------+---------+----------------+------+-------------+

НАБОР ДАННЫХ

  • Таблица R имеет 100 000 строк и следующие поля:

    • RID (primary key): an integer from 1 to 100,000
    • B: случайное равномерно распределенное целое число от 1 до 10.
    • C: случайное равномерно распределенное целое число от 1 до 1000.
  • Таблица S имеет 500 000 строк и следующие поля:

    • SID (primary key): an integer from 1 to 500,000
    • RID (внешний ключ к R): случайное равномерно распределенное целое число от 1 до 100 000.
    • D: случайное равномерно распределенное целое число от 1 до 100.
    • E: случайное равномерно распределенное целое число от 1 до 100 000.

Запрос

SELECT COUNT(R.RID) FROM R, S WHERE R.RID=S.RID AND R.B=5 AND S.E=5;

person Sam    schedule 06.12.2015    source источник
comment
схему в текстовом формате пожалуйста   -  person Drew    schedule 06.12.2015
comment
Ответ на вопрос 2 найден здесь: stackoverflow.com/a/9534935/2022209   -  person Martin Seitl    schedule 06.12.2015
comment
Почему за этот вопрос проголосовали? ОП сделал довольно хорошую попытку задать этот вопрос.   -  person zedfoxus    schedule 06.12.2015


Ответы (1)


Этот запрос также можно переписать так:

 SELECT COUNT(R.RID) FROM R, S WHERE R.RID=S.RID AND R.B=5 AND S.E=5;

 to

 SELECT COUNT(R.RID) 
 FROM R
 INNER JOIN S ON R.RID=S.RID
 WHERE R.B=5 AND S.E=5;

<сильный>1. Что такое предыдущая таблица

Словоблудие на http://dev.mysql.com/doc/refman/5.7/en/explain-output.html для ref и eq_ref может несколько сбивать с толку. Здесь два стола. Каждый ссылается на другой как на предыдущую таблицу (это моя интерпретация). Соединение здесь inner join, поэтому база данных сопоставляет все записи R с S и рассматривает только те записи, которые подходят для проверки, если RID совпадает.

Путаница также возникает, когда документы ссылаются на один и тот же пример как для eq_ref, так и для ref:

SELECT * FROM ref_table,other_table 
WHERE ref_table.key_column=other_table.column;

В целом, когда в объяснении упоминаются ref и eq_ref, я смотрю на соответствующие таблицы, чтобы увидеть, к какому типу соединения они относятся. eq_ref смотрит на PRIMARY или UNIQUE ключи. ref, скорее всего, использует индекс, отличный от PRIMARY/UNIQUE.

<сильный>2. Где используется

Использование where на самом деле использует индекс, как указано в столбце key вывода explain. Индекс используется для удовлетворения where ... S.E = 5, а затем также используется для поиска данных в таблице.

Если бы индекс был покрывающим и данные в таблице не требовалось просматривать, вы могли бы увидеть либо using index (если не используется условие where), либо using index; using where (если используется условие where)

Эта информация идентична ссылке, которую Мартин Зейтл предоставил в своих комментариях.

<сильный>3. Порядок событий

Насколько я понимаю, это:

  • MySQL сначала ищет в индексе SE постоянное значение where ... S.E = 5.
  • Затем он ищет S.RID в таблице S.
  • Затем он сопоставляет записи, которые он уже обнаружил, с R.RID.
  • Наиболее подходящий способ сделать это — обратиться к первичному ключу R, который является RID (поэтому R имеет eq_ref)
  • Поскольку первичный ключ R.RID на самом деле представляет собой всю строку, R.B = 5 можно легко удовлетворить. Так что никакой другой работы не требуется
person zedfoxus    schedule 06.12.2015