выберите версию():
5.7.21
EXPLAINчто
MySQL предоставляетEXPLAIN
команда, она можетSQL
Выписка анализируется и выводитсяSQL
Детали выполнения для целевой оптимизации разработчиками.
Например, анализ оператора SELECT
EXPLAIN SELECT * FROM `user` WHERE id = 1
Объяснить результаты вtypeполе
Советы: распространенные методы сканирования
- система: системная таблица, небольшой объем данных, часто не требуется дисковый ввод-вывод
- const: постоянное соединение
- eq_ref: индекс первичного ключа (первичный ключ) или ненулевой уникальный индекс (уникальный не нулевой) эквивалентное сканирование
- ref: непервичный ключ, неуникальный индекс, равное сканирование
- диапазон: сканирование диапазона
- ИНДЕКС: сканирование индексного дерева
- ВСЕ: полное сканирование таблицы
type
Режим сканирования от быстрого к медленному
system > const > eq_ref > ref > range > index > ALL
1.system
В приведенном выше примере данные запрашиваются из системной метки 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');
Объясните результаты анализа
В приведенном выше примере 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);
Объясните результаты анализа
В приведенном выше примере для предыдущей таблицыuser
Для каждой строки (строки) в таблице после соответствующегоuser_balance
Сканируется только одна строка таблицы, и этот тип сканирования также очень быстрый
Сцены:
-
联表
(присоединиться) запрос - ударил
主键
(первичный ключ) или非空唯一索引
(unique not null) -
等值
соединять
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);
Объясните результаты анализа
Запрос к объединенной таблице
Так как задняя таблица использует普通非唯一索引
, для предыдущей таблицыuser
Каждая строка таблицы (строка), после таблицыuser_balance
В таблице может быть более одной строки данных для сканирования.
Запрос одной таблицы
Когда идентификатор изменяется на общий неуникальный индекс, запрос постоянного соединения также понижается с 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
in
>,>=,<,<=
Диапазон легко понять, это запрос диапазона по индексу, он будет сканировать значение в определенном диапазоне по индексу.
6.index
Голос за кадром: Текущая тестовая таблица — InnoDb, MyISAM имеет встроенный счетчик, и он считывается непосредственно из счетчика при count().
тип индекса, который должен сканировать все данные по индексу, это лишь немного быстрее, чем полное сканирование таблицы
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');
Объясните результаты анализа
Если по идентификатору не построен индекс, выполняется полное сканирование таблицы.
Суммировать
- Введите от быстрого к медленному: system>const>eq_ref>ref>range>index>ALL
- Как квалифицированный бэкенд-разработчик, вы должны быть знакомы с «Объяснением».
- Создайте правильный индекс в сочетании с бизнесом вместо индексации каждого поля (злоупотребление)