I can't understand the following explains:
The first one regards just PAZIENTE and ANALISI, it is ok, it is using index IDX_NOME
explain
select
paziente3_.cognome as col_8_0_
from
Analisi analisi0_
inner join
Paziente paziente3_
on analisi0_.ID_PAZIENTE=paziente3_.ID_PAZIENTE
where
paziente3_.nome like 'MARCO%';
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE paziente3_ range PRIMARY,IDX_NOME IDX_NOME 123 1350 100 Using where; Using index
1 SIMPLE analisi0_ ref FK_ANALISI_PAZIENTE FK_ANALISI_PAZIENTE 4 gestelfolab.paziente3_.ID_PAZIENTE 1 100 Using index
If in the same query, I try to retrieve also SPECIE description, the index IDX_NOME is no more used and there is a full table scan,
explain
select
specie5_.specie as col_5_0_,
paziente3_.cognome as col_8_0_
from
Analisi analisi0_
inner join
Paziente paziente3_
on analisi0_.ID_PAZIENTE=paziente3_.ID_PAZIENTE
inner join
Specie specie5_
on paziente3_.ID_SPECIE=specie5_.ID_SPECIE
where
paziente3_.nome like 'MARCO%';
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE specie5_ index PRIMARY SPECIE 137 1 100 Using index
1 SIMPLE paziente3_ ALL PRIMARY,IDX_NOME,FK_PAZIENTE_SPECIE 176184 10 Range checked for each record (index map: 0x19)
1 SIMPLE analisi0_ ref FK_ANALISI_PAZIENTE FK_ANALISI_PAZIENTE 4 gestelfolab.paziente3_.ID_PAZIENTE 1 100 Using index
Is it due to an error in table definition?
CREATE TABLE SPECIE
(
ID_SPECIE TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
SPECIE VARCHAR(45) NOT NULL UNIQUE,
PRIMARY KEY (ID_SPECIE)
)
ENGINE=InnoDB;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
specie 0 PRIMARY 1 ID_SPECIE A 0 BTREE
specie 0 SPECIE 1 SPECIE A 0 BTREE
CREATE TABLE PAZIENTE
(
ID_PAZIENTE INT UNSIGNED NOT NULL AUTO_INCREMENT,
ID_PAZIENTE_LAB VARCHAR(20),
COGNOME VARCHAR(40),
NOME VARCHAR(40),
DATA_NASCITA DATE,
ID_SESSO TINYINT UNSIGNED NOT NULL,
RECAPITO VARCHAR(50),
CODICE_FISCALE VARCHAR(30),
ID_SPECIE TINYINT UNSIGNED NOT NULL,
PRIMARY KEY (ID_PAZIENTE),
INDEX IDX_DATA_NASCITA (DATA_NASCITA, ID_SESSO, ID_SPECIE),
INDEX IDX_COGNOME (COGNOME, NOME, ID_SESSO, ID_SPECIE),
INDEX IDX_NOME (NOME, COGNOME, ID_SESSO, ID_SPECIE),
CONSTRAINT FK_PAZIENTE_SPECIE FOREIGN KEY (ID_SPECIE) REFERENCES SPECIE(ID_SPECIE),
CONSTRAINT FK_PAZIENTE_SESSO FOREIGN KEY (ID_SESSO) REFERENCES SESSO(ID_SESSO)
)
ENGINE=InnoDB;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
paziente 0 PRIMARY 1 ID_PAZIENTE A 176176 BTREE
paziente 1 IDX_DATA_NASCITA 1 DATA_NASCITA A 15594 YES BTREE
paziente 1 IDX_DATA_NASCITA 2 ID_SESSO A 25007 BTREE
paziente 1 IDX_DATA_NASCITA 3 ID_SPECIE A 17922 BTREE
paziente 1 IDX_COGNOME 1 COGNOME A 62479 YES BTREE
paziente 1 IDX_COGNOME 2 NOME A 163074 YES BTREE
paziente 1 IDX_COGNOME 3 ID_SESSO A 170270 BTREE
paziente 1 IDX_COGNOME 4 ID_SPECIE A 154908 BTREE
paziente 1 IDX_NOME 1 NOME A 55289 YES BTREE
paziente 1 IDX_NOME 2 COGNOME A 166062 YES BTREE
paziente 1 IDX_NOME 3 ID_SESSO A 176184 BTREE
paziente 1 IDX_NOME 4 ID_SPECIE A 176184 BTREE
paziente 1 FK_PAZIENTE_SPECIE 1 ID_SPECIE A 1 BTREE
paziente 1 FK_PAZIENTE_SESSO 1 ID_SESSO A 1 BTREE
If I force the new IDX_NOME:
explain
select
specie5_.specie as col_5_0_,
paziente3_.cognome as col_8_0_
from
Analisi analisi0_
inner join
Paziente paziente3_ FORCE INDEX (IDX_NOME)
on analisi0_.ID_PAZIENTE=paziente3_.ID_PAZIENTE
inner join
Specie specie5_
on paziente3_.ID_SPECIE=specie5_.ID_SPECIE
where
paziente3_.nome like 'MARCO%'
;
the result is the following:
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE specie5_ index PRIMARY SPECIE 137 1 100 Using index
1 SIMPLE paziente3_ range IDX_NOME IDX_NOME 123 1350 100 Using where; Using index; Using join buffer (Block Nested Loop)
1 SIMPLE analisi0_ ref FK_ANALISI_PAZIENTE FK_ANALISI_PAZIENTE 4 gestelfolab.paziente3_.ID_PAZIENTE 1 100 Using index
Maybe we can say that the FULL TABLE SCAN is not a problem in this case?