【发布时间】:2016-05-19 08:43:10
【问题描述】:
我有这个查询现在需要大约 0.57 秒:
SELECT analisi0_.ID_ANALISI AS col_0_0_,
paziente5_.ID_PAZIENTE_LAB AS col_1_0_,
sessione1_.ID_GEL AS col_2_0_,
patologico8_.patologico AS col_3_0_,
tipovalida9_.TIPO_VALIDAZIONE AS col_4_0_,
specie7_.specie AS col_5_0_,
analisi0_.campione AS col_6_0_,
analisi0_.tracciato AS col_7_0_,
paziente5_.cognome AS col_8_0_,
paziente5_.nome AS col_9_0_,
paziente5_.DATA_NASCITA AS col_10_0_,
sesso6_.sesso AS col_11_0_,
sessione1_.NUMERO_SESSIONE AS col_12_0_,
sessione1_.DATA_SESSIONE AS col_13_0_,
metodica4_.metodica AS col_14_0_
FROM Analisi analisi0_
INNER JOIN Sessione sessione1_ ON analisi0_.ID_SESSIONE = sessione1_.ID_SESSIONE
INNER JOIN tipo_sessione tiposessio2_ ON sessione1_.ID_TIPO_SESSIONE = tiposessio2_.ID_TIPO_SESSIONE
INNER JOIN metodica_tipo_metodica metodicati3_ ON tiposessio2_.ID_METODICA_TIPO_METODICA = metodicati3_.ID_METODICA_TIPO_METODICA
INNER JOIN Metodica metodica4_ ON metodicati3_.ID_METODICA = metodica4_.ID_METODICA
INNER JOIN Paziente paziente5_ ON analisi0_.ID_PAZIENTE = paziente5_.ID_PAZIENTE
INNER JOIN Sesso sesso6_ ON paziente5_.ID_SESSO = sesso6_.ID_SESSO
INNER JOIN Specie specie7_ ON paziente5_.ID_SPECIE = specie7_.ID_SPECIE
LEFT OUTER JOIN Patologico patologico8_ ON analisi0_.ID_PATOLOGICO = patologico8_.ID_PATOLOGICO
INNER JOIN tipo_validazione tipovalida9_ ON analisi0_.ID_TIPO_VALIDAZIONE = tipovalida9_.ID_TIPO_VALIDAZIONE
WHERE 1 = 1
AND (paziente5_.nome LIKE 'MARIA%')
AND (paziente5_.DATA_NASCITA IS NOT NULL OR paziente5_.DATA_NASCITA > 0)
LIMIT 20;
问题是通过以下方式添加此默认顺序:
ORDER BY sessione1_.DATA_SESSIONE ASC
查询在 25 秒内执行。
未排序的解释是:
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE specie7_ index PRIMARY SPECIE 137 1 100 Using index
1 SIMPLE paziente5_ ALL PRIMARY,IDX_DATA_NASCITA,IDX_NOME,FK_PAZIENTE_SPECIE,FK_PAZIENTE_SESSO 690950 5 Range checked for each record (index map: 0x3B)
1 SIMPLE sesso6_ eq_ref PRIMARY PRIMARY 1 elettroforesi.paziente5_.ID_SESSO 1 100
1 SIMPLE analisi0_ ref FK_ANALISI_PAZIENTE,FK_ANALISI_SESSIONE,FK_ANALISI_TIPO_VALIDAZIONE FK_ANALISI_PAZIENTE 4 elettroforesi.paziente5_.ID_PAZIENTE 1 100
1 SIMPLE tipovalida9_ eq_ref PRIMARY PRIMARY 1 elettroforesi.analisi0_.ID_TIPO_VALIDAZIONE 1 100
1 SIMPLE patologico8_ eq_ref PRIMARY PRIMARY 1 elettroforesi.analisi0_.ID_PATOLOGICO 1 100
1 SIMPLE sessione1_ eq_ref PRIMARY,FK_SESSIONE_TIPO_SESSIONE PRIMARY 4 elettroforesi.analisi0_.ID_SESSIONE 1 100
1 SIMPLE tiposessio2_ eq_ref PRIMARY,FK_TIPO_SESSIONE_METODICA_TIPO_METODICA PRIMARY 2 elettroforesi.sessione1_.ID_TIPO_SESSIONE 1 100
1 SIMPLE metodicati3_ eq_ref PRIMARY,ID_METODICA PRIMARY 2 elettroforesi.tiposessio2_.ID_METODICA_TIPO_METODICA 1 100
1 SIMPLE metodica4_ eq_ref PRIMARY PRIMARY 2 elettroforesi.metodicati3_.ID_METODICA 1 100
虽然排序版本的解释是
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE specie7_ index PRIMARY SPECIE 137 1 100 Using index; Using temporary; Using filesort
1 SIMPLE paziente5_ ALL PRIMARY,IDX_DATA_NASCITA,IDX_NOME,FK_PAZIENTE_SPECIE,FK_PAZIENTE_SESSO 690950 5 Range checked for each record (index map: 0x3B)
1 SIMPLE sesso6_ eq_ref PRIMARY PRIMARY 1 elettroforesi.paziente5_.ID_SESSO 1 100
1 SIMPLE analisi0_ ref FK_ANALISI_PAZIENTE,FK_ANALISI_SESSIONE,FK_ANALISI_TIPO_VALIDAZIONE FK_ANALISI_PAZIENTE 4 elettroforesi.paziente5_.ID_PAZIENTE 1 100
1 SIMPLE tipovalida9_ eq_ref PRIMARY PRIMARY 1 elettroforesi.analisi0_.ID_TIPO_VALIDAZIONE 1 100
1 SIMPLE patologico8_ eq_ref PRIMARY PRIMARY 1 elettroforesi.analisi0_.ID_PATOLOGICO 1 100
1 SIMPLE sessione1_ eq_ref PRIMARY,FK_SESSIONE_TIPO_SESSIONE PRIMARY 4 elettroforesi.analisi0_.ID_SESSIONE 1 100
1 SIMPLE tiposessio2_ eq_ref PRIMARY,FK_TIPO_SESSIONE_METODICA_TIPO_METODICA PRIMARY 2 elettroforesi.sessione1_.ID_TIPO_SESSIONE 1 100
1 SIMPLE metodicati3_ eq_ref PRIMARY,ID_METODICA PRIMARY 2 elettroforesi.tiposessio2_.ID_METODICA_TIPO_METODICA 1 100
1 SIMPLE metodica4_ eq_ref PRIMARY PRIMARY 2 elettroforesi.metodicati3_.ID_METODICA 1 100
SESSIONE 表上的索引:
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
sessione 0 PRIMARY 1 ID_SESSIONE A 44468 BTREE
sessione 1 IDX_DATA_SESSIONE 1 DATA_SESSIONE A 878 BTREE
sessione 1 IDX_NUMERO_SESSIONE 1 NUMERO_SESSIONE A 168 BTREE
sessione 1 FK_SESSIONE_TIPO_SESSIONE 1 ID_TIPO_SESSIONE A 6 BTREE
sessione 1 FK_SESSIONE_UTENTE_INSERIMENTO 1 ID_UTENTE_INSERIMENTO A 1 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),
INDEX IDX_COGNOME (COGNOME),
INDEX IDX_NOME (NOME),
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;
CREATE TABLE ANALISI
(
ID_ANALISI INT UNSIGNED NOT NULL AUTO_INCREMENT,
ID_PAZIENTE INT UNSIGNED NOT NULL,
ID_SESSIONE INT UNSIGNED NOT NULL,
TRACCIATO TINYINT UNSIGNED NOT NULL,
CAMPIONE VARCHAR(30),
ID_PATOLOGICO TINYINT UNSIGNED,
REPARTO VARCHAR(40),
TOTALE_PROTEINE FLOAT,
RAPP_AG FLOAT,
ID_ANALISI_LINK INT UNSIGNED,
ID_ANALISI_IFE INT UNSIGNED,
ID_ANALISI_DATI INT UNSIGNED,
ID_ANALISI_NOTA INT UNSIGNED,
DATA_MODIFICA DATETIME,
ID_UTENTE_MODIFICA SMALLINT UNSIGNED,
DATA_VALIDAZIONE DATETIME,
ID_TIPO_VALIDAZIONE TINYINT UNSIGNED NOT NULL,
ID_UTENTE_VALIDAZIONE SMALLINT UNSIGNED,
DATA_CANCELLAZIONE DATETIME,
ID_UTENTE_CANCELLAZIONE SMALLINT UNSIGNED,
PRIMARY KEY (ID_ANALISI),
INDEX IDX_CAMPIONE (CAMPIONE),
INDEX IDX_PAZIENTE (ID_PAZIENTE),
INDEX IDX_SESSIONE (ID_SESSIONE),
INDEX IDX_REPARTO (DATA_MODIFICA),
CONSTRAINT FK_ANALISI_PAZIENTE FOREIGN KEY (ID_PAZIENTE) REFERENCES PAZIENTE(ID_PAZIENTE),
CONSTRAINT FK_ANALISI_SESSIONE FOREIGN KEY (ID_SESSIONE) REFERENCES SESSIONE(ID_SESSIONE),
CONSTRAINT FK_ANALISI_PATOLOGICO FOREIGN KEY (ID_PATOLOGICO) REFERENCES PATOLOGICO(ID_PATOLOGICO),
CONSTRAINT FK_ANALISI_TIPO_VALIDAZIONE FOREIGN KEY (ID_TIPO_VALIDAZIONE) REFERENCES TIPO_VALIDAZIONE(ID_TIPO_VALIDAZIONE),
CONSTRAINT FK_ANALISI_UTENTE_MODIFICA FOREIGN KEY (ID_UTENTE_MODIFICA) REFERENCES UTENTE(ID_UTENTE),
CONSTRAINT FK_ANALISI_UTENTE_VALIDAZIONE FOREIGN KEY (ID_UTENTE_VALIDAZIONE) REFERENCES UTENTE(ID_UTENTE),
CONSTRAINT FK_ANALISI_UTENTE_CANCELLAZIONE FOREIGN KEY (ID_UTENTE_CANCELLAZIONE) REFERENCES UTENTE(ID_UTENTE),
CONSTRAINT FK_ANALISI_ANALISI_LINK FOREIGN KEY (ID_ANALISI_LINK) REFERENCES ANALISI(ID_ANALISI),
CONSTRAINT FK_ANALISI_ANALISI_IFE FOREIGN KEY (ID_ANALISI_IFE) REFERENCES ANALISI_IFE(ID_ANALISI_IFE),
CONSTRAINT FK_ANALISI_ANALISI_NOTA FOREIGN KEY (ID_ANALISI_NOTA) REFERENCES ANALISI_NOTA(ID_ANALISI_NOTA),
CONSTRAINT FK_ANALISI_ANALISI_DATI FOREIGN KEY (ID_ANALISI_DATI) REFERENCES ANALISI_DATI(ID_ANALISI_DATI)
)
ENGINE=InnoDB;
【问题讨论】:
-
这是否与显示您的
innodb_buffer_pool_size太小的那个重复? -
我仍然有 2GByte 分配给 4GByte 的 i5 上的 mysql 的问题,我还尝试使用表 analisi 上的日期来简化查询,该列也被索引,Analisi 上有 160 万行和 Paziente 上的 0.8M 行,以下查询需要 5 秒没有 order by 和 75 秒有 order by,我想我会尝试使用整数而不是 datetime 来存储我的时间戳 --> SELECT analisi0_.ID_ANALISI FROM Analisi analisi0_ INNER JOIN Paziente paziente1_ ON analisi0_.ID_PAZIENTE = paziente1_.ID_PAZIENTE WHERE paziente1_.ID_SESSO = 1 ORDER BY analisi0_.DATA_MODIFICA DESC ;
-
我也尝试将 3GByte 分配给 mysql 但没有增强
-
datetime vs timestamp vs int 应该执行相同的操作。
-
实际上我在任何日期都使用 DATETIME 但我认为结果真的很差,160 万行订单的 75 秒似乎太多了,我希望解决方案不会是插入分析表上的 ID_SESSO :-)
标签: mysql indexing sql-order-by