У меня есть главная таблица и дочерняя таблица с одним внешним ключом. Когда я подключаюсь между этими двумя таблицами и использовать объяснить заявление для анализа производительностиВнешние ключи оптимизации запросов Mysql
я набираюсь объяснить выход как «Type = ALL», который считается худшим для исполнения. Как я могу улучшить производительность этого соединения.
объяснить выход только показывает «possible_keys: cid_index» вместо ключа и Длина ключа
Вот тест
CREATE TABLE `master` (
`mid` bigint(20) NOT NULL AUTO_INCREMENT,
`mname` varchar(20) NOT NULL,
PRIMARY KEY (`mid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
select * from master;
+-----+-------+
| mid | mname |
+-----+-------+
| 1 | one |
| 2 | two |
+-----+-------+
2 rows in set (0.25 sec)
CREATE TABLE `child` (
`cid` bigint(20) NOT NULL AUTO_INCREMENT,
`cname` varchar(10) NOT NULL,
`Ccid` bigint(20) DEFAULT NULL,
PRIMARY KEY (`cid`),
KEY `cid_index` (`Ccid`),
CONSTRAINT `new_fk_constraint` FOREIGN KEY (`Ccid`) REFERENCES `master` (`mid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
select * from child;
+-----+-------+------+
| cid | cname | Ccid |
+-----+-------+------+
| 1 | Cone | 1 |
| 2 | ctwo | 2 |
+-----+-------+------+
2 rows in set (0.12 sec)
explain select m.*,c.* from master m join child c on m.mid=c.Ccid \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: m
type: ALL
possible_keys: PRIMARY
key: NULL
key_len: NULL
ref: NULL
rows: 2
Extra:
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: c
type: ALL
possible_keys: cid_index
key: NULL
key_len: NULL
ref: NULL
rows: 2
Extra: Using where; Using join buffer
2 rows in set (0.23 sec)
Сколько строк данных у вас есть в таблице? Из вашего примера это похоже на 4 строки? Использование индекса здесь неэффективно, так как сканирование таблицы может быть выполнено быстрее с такими небольшими объемами данных. Помните, что план выполнения запроса со временем изменится. – Namphibian
'JOIN' - декартово произведение, поэтому использование индексов бессмысленно? – SparKot
Я увеличил количество записей до 10 в каждом. Теперь MySQL использует индексы для сравнения. Должен быть одним из этих трюков Query Optimisation, взвешивающих накладные расходы. – SparKot