Intereting Posts
параметризованный запрос в MS Access 2003 с использованием vba как решить system.data.sqlclient.sqlexception (0x80131904) ошибка SQL. Вычислить следующую строку на основе предыдущего в том же столбце. Как вставить значения таблиц из одной базы данных в другую базу данных? NHibernate QueryOver с выборкой из нескольких запросов sql и db-запросов производительность – выбор одного соединения по сравнению с несколькими простыми выборами C # – ExecuteNonQuery () не работает с SQL Server CE Entity Framework 6: первый каскадный код кода Прикрепить несколько баз данных с помощью T-SQL Дизайн базы данных Facebook? SQL-запрос для перевода списка чисел, сопоставляемых с несколькими диапазонами, в список значений Как реализовать алгоритм ранжирования на моем веб-сайте для сортировки данных базы данных? Как лучше блокировать несколько «счетчиков» на счетчике? Замена текста в столбце BLOB Как решить закрытую ошибку набора данных при запуске запроса на обновление в Delphi 7?

понимание 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, почему он указывает Using where? в столбце «Дополнительно» вместо « Using Index ? И в нем конкретно говорится, что он использует индекс, глядя на KEY column : SE
  3. Что касается порядка операций, делает ли MySQL весь процесс в этом порядке? SE = 5 с использованием индекса R.Rid = S.Rid, используя записи предыдущего шага, RB = 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 RB=5 AND SE=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 | +----+-------------+-------+--------+---------------+---------+---------+----------------+------+-------------+ 

DATASET

запрос

 SELECT COUNT(R.RID) FROM R, S WHERE R.RID=S.RID AND RB=5 AND SE=5; 

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

  SELECT COUNT(R.RID) FROM R, S WHERE R.RID=S.RID AND RB=5 AND SE=5; to SELECT COUNT(R.RID) FROM R INNER JOIN S ON R.RID=S.RID WHERE RB=5 AND SE=5; 

1. Что такое предыдущая таблица

eq_ref ref на 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. Использование

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

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

Эта информация идентична ссылке Martin Seitl, приведенной в его комментариях

3. Порядок проведения мероприятий

Я понимаю, что:

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