Schaffung ich nicht verstehen kann folgend erklärt:MySQL Probleme mit Tabellendefinition fulltable Scan
Die ersten Grüße nur paziente und ANALISI, es ist in Ordnung, es wird mit 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
wenn in derselben Abfrage, versuche ich auch SPECIE Beschreibung abzurufen, ist der Index IDX_NOME nicht mehr verwendet und es gibt einen vollständigen Tabellenscan,
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
ist es wegen ein Fehler in der Tabellendefinition?
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
Wenn ich die neue IDX_NOME erzwingen:
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%'
;
das Ergebnis ist die folgende:
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
Vielleicht können wir sagen, dass die FULL SCAN TABLE ist kein Problem in dieser Fall?
Lernen Sie von Ihren früheren Posts, wie man einen Beitrag formatiert –
a) Bearbeiten Sie Ihre Frage, fügen Sie keine Antwort hinzu. b) Add show index für ALLE relevanten Tabellen (Spezies scheint problematisch) c) Ich schlug einen Index 'IDX_NOME (NOME, ID_SPECIE)' (nicht mehr) oder umgekehrt vor, aber das scheint nicht das Problem zu sein. d) Ihre Statistiken sehen gut aus, aber sie sagen, dass jede 'ID_spezies' den gleichen Wert in' paziente' hat. Ist das korrekt? e) Aus irgendeinem Grund ist mysql der Meinung, dass der direkte Zugriff auf die Arten-Tabelle zu teuer ist. f) Versuch: 1. addiere ';' nach 'wie 'MARCO%';'. 2. Versuchen Sie 'force index ...' wie in meiner Antwort beschrieben. 3. 'ANALYZE TABLE paziente, species' 4. Was ist deine mysql-Version? – Solarflare
Danke nochmal für deine Zeit, – Etantonio