Подробное объяснение типа объяснения Mysql

MySQL

выберите версию():5.7.21

EXPLAINчто

MySQL предоставляетEXPLAINкоманда, она можетSQLВыписка анализируется и выводитсяSQLДетали выполнения для целевой оптимизации разработчиками.

Например, анализ оператора SELECT

EXPLAIN SELECT * FROM `user` WHERE id = 1 

explain-type

Объяснить результаты вtypeполе

Советы: распространенные методы сканирования

  • система: системная таблица, небольшой объем данных, часто не требуется дисковый ввод-вывод
  • const: постоянное соединение
  • eq_ref: индекс первичного ключа (первичный ключ) или ненулевой уникальный индекс (уникальный не нулевой) эквивалентное сканирование
  • ref: непервичный ключ, неуникальный индекс, равное сканирование
  • диапазон: сканирование диапазона
  • ИНДЕКС: сканирование индексного дерева
  • ВСЕ: полное сканирование таблицы

typeРежим сканирования от быстрого к медленному

system > const > eq_ref > ref > range > index > ALL

1.system

explain-type

В приведенном выше примере данные запрашиваются из системной метки proxies_priv системной библиотеки mysql.Данные здесь были загружены в память при запуске службы Mysql, и дисковый ввод-вывод не требуется.

Объяснение в официальной документации:该表只有一行(=系统表)。这是const联接类型的特例

2.const

Данные моделирования
create table user (
  id int primary key,
  name varchar(20)
)engine=innodb;

insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');
Объясните результаты анализа

explain-type

В приведенном выше примере id — это первичный ключ, а часть подключения — это константа 1, которую можно найти один раз по индексу, что очень быстро.

Сцены:

  • ударил主键(primary key)или唯一索引(unique)
  • Связная часть представляет собой常量值(const)

3.eq_ref

Данные моделирования
create table user (
  id int primary key,
  name varchar(20)
)engine=innodb;

insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');

create table user_balance (
  uid int primary key,
  balance int
)engine=innodb;

insert into user_balance values(1,100);
insert into user_balance values(2,200);
insert into user_balance values(3,300);
insert into user_balance values(4,400);
insert into user_balance values(5,500);
Объясните результаты анализа

explain-type

В приведенном выше примере для предыдущей таблицыuserДля каждой строки (строки) в таблице после соответствующегоuser_balanceСканируется только одна строка таблицы, и этот тип сканирования также очень быстрый

Сцены:

  1. 联表(присоединиться) запрос
  2. ударил主键(первичный ключ) или非空唯一索引(unique not null)
  3. 等值соединять

4.ref

Данные моделирования

Отличие от данных моделирования eq_ref: в таблице user_balance主键索引изменить на普通索引

create table user (
  id int primary key,
  name varchar(20)
)engine=innodb;

insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');

create table user_balance (
  uid int,
  balance int,
  index(uid)
)engine=innodb;

insert into user_balance values(1,100);
insert into user_balance values(2,200);
insert into user_balance values(3,300);
insert into user_balance values(4,400);
insert into user_balance values(5,500);
Объясните результаты анализа

Запрос к объединенной таблице

explain-type

Так как задняя таблица использует普通非唯一索引, для предыдущей таблицыuserКаждая строка таблицы (строка), после таблицыuser_balanceВ таблице может быть более одной строки данных для сканирования.

Запрос одной таблицы

explain-type

Когда идентификатор изменяется на общий неуникальный индекс, запрос постоянного соединения также понижается с const до ref.Из-за неуникального индекса может быть просканировано более одной строки данных.

refКаждое совпадение может возвращать несколько строк данных, хотя это медленнее, чем eq_ref, это все же быстрый тип соединения.

Сцены:

  • Запрос к объединенной таблице
  • Обычный неуникальный индекс

5.range

Данные моделирования
create table user (
  id int primary key,
  name varchar(20)
)engine=innodb;

insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');
insert into user values(5,'zhaoliu');
Объясните результаты анализа

between

explain-type

in

explain-type

>,>=,<,<=

explain-type

Диапазон легко понять, это запрос диапазона по индексу, он будет сканировать значение в определенном диапазоне по индексу.

6.index

Голос за кадром: Текущая тестовая таблица — InnoDb, MyISAM имеет встроенный счетчик, и он считывается непосредственно из счетчика при count().

explain-type

тип индекса, который должен сканировать все данные по индексу, это лишь немного быстрее, чем полное сканирование таблицы

7.ALL

Данные моделирования
create table user (
  id int,
  name varchar(20)
)engine=innodb;

insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');
insert into user values(5,'zhaoliu');
Объясните результаты анализа

explain-type

Если по идентификатору не построен индекс, выполняется полное сканирование таблицы.

Суммировать

  • Введите от быстрого к медленному: system>const>eq_ref>ref>range>index>ALL
  • Как квалифицированный бэкенд-разработчик, вы должны быть знакомы с «Объяснением».
  • Создайте правильный индекс в сочетании с бизнесом вместо индексации каждого поля (злоупотребление)