2013-02-18 3 views
2

У меня есть главная таблица и дочерняя таблица с одним внешним ключом. Когда я подключаюсь между этими двумя таблицами и использовать объяснить заявление для анализа производительностиВнешние ключи оптимизации запросов Mysql

  1. я набираюсь объяснить выход как «Type = ALL», который считается худшим для исполнения. Как я могу улучшить производительность этого соединения.

  2. объяснить выход только показывает «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) 
+0

Сколько строк данных у вас есть в таблице? Из вашего примера это похоже на 4 строки? Использование индекса здесь неэффективно, так как сканирование таблицы может быть выполнено быстрее с такими небольшими объемами данных. Помните, что план выполнения запроса со временем изменится. – Namphibian

+0

'JOIN' - декартово произведение, поэтому использование индексов бессмысленно? – SparKot

+0

Я увеличил количество записей до 10 в каждом. Теперь MySQL использует индексы для сравнения. Должен быть одним из этих трюков Query Optimisation, взвешивающих накладные расходы. – SparKot

ответ

3

Если стол слишком мал, с не очень фильтровать , производительность может быть не такой, как ожидалось. Обычно, если предложение where фильтрует больше, чем x% (около 30%), сканирование всей таблицы будет более эффективным. Пожалуйста, проверьте On mysql performance

Также вы можете попробовать, чтобы заставить индекс и проверить, если индекс утилизируется

explain select m.*,c.* 
from master m 
join child c force index(Ccid) 
on m.mid=c.Ccid 
Смежные вопросы