2016-08-30 2 views
0

Я создал две таблицы, в которых есть одно отношение.Mysql Индексация не работает

команды: -

CREATE TABLE TEAM(
    ID INT(5) NOT NULL AUTO_INCREMENT, 
    NAME VARCHAR(6) NOT NULL, 
    PRIMARY KEY(ID) 
)ENGINE=INNODB; 

Член: -

CREATE TABLE MEMBER (
    ID INT(5) NOT NULL AUTO_INCREMENT, 
    NAME VARCHAR(6) NOT NULL, 
    TEAM_ID INT(5) NOT NULL, 
    PRIMARY KEY (ID), 
    KEY TEAM_ID (TEAM_ID), 
    CONSTRAINT MEMBER_ibfk_1 FOREIGN KEY (TEAM_ID) REFERENCES TEAM (ID) 
) ENGINE=InnoDB 

Одна команда может иметь много членов.

данных внутри оба таблиц: -

команда Таблица

ID NAME 
1 TEAM 1 
2 TEAM 2 

Member Table:- 

ID NAME TEAM_ID 
1 M1 1 
2 M2 1 
3 M3 1 
4 M4 1 
5 M5 1 
6 M6 1 
7 M7 1 
8 M8 1 
9 M9 2 
10 M10 2 
11 M11 2 
12 M12 2 

команда 1, имеющая 8 членов команды & 2, имеющая 4 членов.

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

SELECT * FROM TEAM JOIN MEMBER ON TEAM.ID = MEMBER.TEAM_ID WHERE TEAM.ID = 1 

Когда я объясняю план запроса, я становлюсь ниже вывода.

id select_type table type possible_keys key  key_len ref  rows   Extra 
1 SIMPLE  TEAM const PRIMARY   PRIMARY 4  const 1  \N 
1 SIMPLE  MEMBER ALL  TEAM_ID   \N  \N  \N  12  Using where 

Я уже указал индекс на внешний ключ, но все же mysql сканирует все строки таблицы элементов? Почему такое?

Я использую версию mysql версии 5.6.12.

Пожалуйста, помогите.

ответ

4

Mysql рассматривает возможность полного сканирования вместо того, чтобы лучше читать индекс, потому что большинство значений в индексе имеет значение 1. Если он решает отсканировать индекс и извлечь данные из него, тогда потребуется выполнить дополнительный поиск для получения реального данные из таблицы. Это не оптимальный путь. Попробуйте создать третью команду только с одним членом, и в этом случае mysql должен использовать индекс. Mysql начнет использовать индекс, так как ваш db будет расти, и более уникальные данные будут сохранены в TEAM_ID по сравнению с целыми данными. Это называется мощностью индекса. См. Объяснение здесь What is cardinality in MySQL?.

+0

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

+0

Я вставил больше записей в таблицу и начал сканирование соответствующей строки, а не всей строки. Есть ли у вас какая-либо ссылка на этот ответ? –

+0

Вам следует искать мощность индекса. Одним из источников является https://webmonkeyuk.wordpress.com/2010/09/27/what-makes-a-good-mysql-index-part-2-cardinality/ –

Смежные вопросы