在500k行上,mysql行到列查询速度太慢(10秒)

在500k行上,mysql行到列查询速度太慢(10秒),mysql,select,Mysql,Select,查询表analisi_campo_free的约500.000行和表campo_free的6行大约需要10秒, 这对我来说是个问题,有没有办法优化它 SELECT acf.ID_ANALISI, max( if(cf.posizione = 1, acf.valore, NULL) ) as campo_free_1, max( if(cf.posizione = 2, acf.valore, NULL) ) as campo_free_2,

查询表analisi_campo_free的约500.000行和表campo_free的6行大约需要10秒, 这对我来说是个问题,有没有办法优化它

SELECT acf.ID_ANALISI,
          max( if(cf.posizione = 1, acf.valore, NULL) ) as campo_free_1,
          max( if(cf.posizione = 2, acf.valore, NULL) ) as campo_free_2,
          max( if(cf.posizione = 3, acf.valore, NULL) ) as campo_free_3,
          max( if(cf.posizione = 4, acf.valore, NULL) ) as campo_free_4,
          max( if(cf.posizione = 5, acf.valore, NULL) ) as campo_free_5,    
          max( if(cf.posizione = 6, acf.valore, NULL) ) as campo_free_6
      FROM analisi_campo_free acf
      inner JOIN campo_free cf ON acf.ID_CAMPO_FREE = cf.ID_CAMPO_FREE
      GROUP BY acf.ID_ANALISI; 
这就是解释:

id  select_type table   partitions  type    possible_keys   key key_len ref rows    filtered    Extra
1   SIMPLE  acf     ALL ID_ANALISI,FK_ANALISI_CAMPO_FREE_CAMPO_FREE             514271  100 Using temporary; Using filesort
1   SIMPLE  cf      eq_ref  PRIMARY PRIMARY 1   elettroforesi.acf.ID_CAMPO_FREE 1   100 
这些表格定义如下:

// ANALISI_CAMPO_FREE
CREATE TABLE ANALISI_CAMPO_FREE
(
   ID_ANALISI_CAMPO_FREE   INT           UNSIGNED NOT NULL AUTO_INCREMENT,
   ID_ANALISI              INT           UNSIGNED NOT NULL, 
   ID_CAMPO_FREE           TINYINT       UNSIGNED NOT NULL,
   VALORE                  VARCHAR(45),
   PRIMARY KEY(ID_ANALISI_CAMPO_FREE),
   INDEX IDX_ID_ANALISI (ID_ANALISI),
   CONSTRAINT FK_ANALISI_CAMPO_FREE_ANALISI FOREIGN KEY (ID_ANALISI)  REFERENCES ANALISI (ID_ANALISI),
   CONSTRAINT FK_ANALISI_CAMPO_FREE_CAMPO_FREE FOREIGN KEY (ID_CAMPO_FREE)  REFERENCES CAMPO_FREE (ID_CAMPO_FREE)
)
ENGINE=InnoDB;        


// CAMPO_FREE
CREATE TABLE CAMPO_FREE
(
   ID_CAMPO_FREE           TINYINT       UNSIGNED NOT NULL AUTO_INCREMENT,
   ID_LABORATORIO          TINYINT       UNSIGNED NOT NULL,
   POSIZIONE               TINYINT       UNSIGNED NOT NULL,   
   DESCRIZIONE             VARCHAR(30)   NOT NULL UNIQUE,
   UTILIZZATO              BIT           DEFAULT 0,
   PRIMARY KEY(ID_CAMPO_FREE),
   UNIQUE (ID_LABORATORIO, POSIZIONE, UTILIZZATO),
   CONSTRAINT FK_CAMPO_FREE_LABORATORIO FOREIGN KEY (ID_LABORATORIO)  REFERENCES LABORATORIO(ID_LABORATORIO)
)
ENGINE=InnoDB;


Table   Non_unique  Key_name    Seq_in_index    Column_name Collation   Cardinality Sub_part    Packed  Null    Index_type  Comment Index_comment
analisi_campo_free  0   PRIMARY 1   ID_ANALISI_CAMPO_FREE   A   419292              BTREE       
analisi_campo_free  1   IDX_ID_ANALISI  1   ID_ANALISI  A   419351              BTREE       
analisi_campo_free  1   FK_ANALISI_CAMPO_FREE_CAMPO_FREE    1   ID_CAMPO_FREE   A   1               BTREE       

感谢您的帮助

除了添加适当的索引外,查询看起来还不错。你认为这张表能有多大?大概有2.000.000行,对我来说太慢了,这只是详细说明的一部分。你能推荐一些索引吗?因为有很好的记录,所以投票率较高。Ping的人喜欢这样:嘿@TimBiegeleisen你现在觉得怎么样?蒂姆不太介意骚扰,所以我可以逍遥法外。因此,如果您可以将一个相当大的结果集与导出放在一起,我们可以尝试改进it@Drew我不介意Harrasment,除非它是以否决票的形式发生的。