1

最初の半分の時間で実行されるように最適化したこのクエリがあります。

今、いくつかのインデックスを作成して実行を改善したいのですが、それを行う方法が見つかりません。

クエリは次のとおりです。

SELECT straight_join CONCAT(IFNULL(u.nombre,''), ' ', IFNULL(u.apellidos,''), ' ', IFNULL(u.apellido2,''), ' ; ', IFNULL(u.correo,''), ' ; ', IFNULL(u.telefono,''), ' ', 
                            IFNULL(u.horario,''), ' ; ', IFNULL(u.telefono2,''), ' ', IFNULL(u.horario2,''), ' ; ', IFNULL(u.fecha_prox_llamada,'')) AS datos, 
        usuariohist1.web, usuariohist1.comentario, u.usuario_id, estad.estad_id, 
        estad.fecha, estad.tipoinf, estad.web_id, estad.procede, estad.convocatoria_id, eventos.evento as curso, 
        centros.centro, centros.centro_id 
    FROM centros 
    INNER JOIN convocatorias ON centros.centro_id = convocatorias.centro_id  
    INNER JOIN eventos ON eventos.evento_id = convocatorias.evento_id 
    INNER JOIN estad ON estad.convocatoria_id = convocatorias.convocatoria_id 
    INNER JOIN usuarios AS u ON estad.usuario_id = u.usuario_id 
    LEFT JOIN (select web, comentario, usuario_id FROM usuariohist order by fecha desc, id desc ) as usuariohist1       
        ON u.usuario_id = usuariohist1.usuario_id OR u.n_usuario = usuariohist1.usuario_id 
WHERE centros.segcupones = 1 and u.fecha_prox_llamada = '2013-02-13' 
    group by u.usuario_id, estad.web_id, estad.convocatoria_id 
    order by estad.fecha desc \G    

実行計画は次のとおりです。

*************************** 1. row ***************************
           id: 1
  select_type: PRIMARY
        table: centros
         type: ALL
possible_keys: PRIMARY,centro_id,centro_id_2
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 2622
        Extra: Using where; Using temporary; Using filesort
*************************** 2. row ***************************
           id: 1
  select_type: PRIMARY
        table: convocatorias
         type: ref
possible_keys: PRIMARY,FK_convocatorias_evento_id,FK_convocatorias_centro_id
          key: FK_convocatorias_centro_id
      key_len: 3
          ref: formaweb_op.centros.centro_id
         rows: 66
        Extra: Using where
*************************** 3. row ***************************
           id: 1
  select_type: PRIMARY
        table: eventos
         type: eq_ref
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 4
          ref: formaweb_op.convocatorias.evento_id
         rows: 1
        Extra: 
*************************** 4. row ***************************
           id: 1
  select_type: PRIMARY
        table: estad
         type: ref
possible_keys: FK_Estad_Convocatorias,FK_Estad_Usuarios
          key: FK_Estad_Convocatorias
      key_len: 4
          ref: formaweb_op.convocatorias.convocatoria_id
         rows: 4
        Extra: 
*************************** 5. row ***************************
           id: 1
  select_type: PRIMARY
        table: u
         type: eq_ref
possible_keys: PRIMARY,usuario_id
          key: PRIMARY
      key_len: 4
          ref: formaweb_op.estad.usuario_id
         rows: 1
        Extra: Using where
*************************** 6. row ***************************
           id: 1
  select_type: PRIMARY
        table: <derived2>
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 23971
        Extra: 
*************************** 7. row ***************************
           id: 2
  select_type: DERIVED
        table: usuariohist
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 28594
        Extra: Using filesort
7 rows in set (0.48 sec)

centros テーブル (centro_id、centro、segcupones) にカバリング インデックスを作成しましたが、パフォーマンスは改善されませんでした (またはほとんど改善されませんでした)。現在、実行計画はインデックスを使用していることを示していますが、一時およびファイルソートも使用しています。

*************************** 1. row ***************************
           id: 1
  select_type: PRIMARY
        table: centros
         type: index
possible_keys: PRIMARY,centro_id,centro_id_2,centro_id_3
          key: centro_id_3
      key_len: 307
          ref: NULL
         rows: 2873
        Extra: Using where; Using index; Using temporary; Using filesort
*************************** 2. row ***************************
           id: 1
  select_type: PRIMARY
        table: convocatorias
         type: ref
possible_keys: PRIMARY,FK_convocatorias_evento_id,FK_convocatorias_centro_id
          key: FK_convocatorias_centro_id
      key_len: 3
          ref: formaweb_op.centros.centro_id
         rows: 66
        Extra: Using where
*************************** 3. row ***************************
           id: 1
  select_type: PRIMARY
        table: eventos
         type: eq_ref
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 4
          ref: formaweb_op.convocatorias.evento_id
         rows: 1
        Extra: 
*************************** 4. row ***************************
           id: 1
  select_type: PRIMARY
        table: estad
         type: ref
possible_keys: FK_Estad_Convocatorias,FK_Estad_Usuarios
          key: FK_Estad_Convocatorias
      key_len: 4
          ref: formaweb_op.convocatorias.convocatoria_id
         rows: 4
        Extra: 
*************************** 5. row ***************************
           id: 1
  select_type: PRIMARY
        table: u
         type: eq_ref
possible_keys: PRIMARY,usuario_id
          key: PRIMARY
      key_len: 4
          ref: formaweb_op.estad.usuario_id
         rows: 1
        Extra: Using where
*************************** 6. row ***************************
           id: 1
  select_type: PRIMARY
        table: <derived2>
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 23971
        Extra: 
*************************** 7. row ***************************
           id: 2
  select_type: DERIVED
        table: usuariohist
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 28594
        Extra: Using filesort
7 rows in set (0.54 sec)

テーブル usuariohist (DERIVED) のインデックスも作成しましたが、成功しませんでした。クエリ プランは同じままです。これらのインデックスを試しました: (fecha, id), (usuario_id, fecha, id) およびカバー インデックス (usuario_id, fecha, id, web, comentario)。

関連するテーブルからのインデックス:

CREATE TABLE `centros` (

    ...FIELDS...

  PRIMARY KEY (`centro_id`),
  KEY `FK_Centros_Aux_Paises` (`pais_id`),
  KEY `FK_Centros_Aux_Provincias` (`provincia_id`),
  KEY `FK_Centros_Centros_Grupo` (`grupo_id`),
  KEY `centro_id_2` (`centro_id`,`tipouniversidad`),
  KEY `centro_id` (`centro_id`,`padre_id`,`provincia_id`),
  KEY `centro_id_3` (`centro_id`,`centro`,`segcupones`),
  CONSTRAINT `FK_Centros_Aux_Paises` FOREIGN KEY (`pais_id`) REFERENCES `aux_paises` (`pais_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `FK_Centros_Aux_Provincias` FOREIGN KEY (`provincia_id`) REFERENCES `aux_provincias` (`provincia_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `FK_Centros_Centros_Grupo` FOREIGN KEY (`grupo_id`) REFERENCES `centros_grupo` (`grupo_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=3373 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci


CREATE TABLE `convocatorias` (

    ...FIELDS...

  PRIMARY KEY (`convocatoria_id`),
  KEY `FK_Convocatorias_Centros` (`centro_id`),
  KEY `FK_Convocatorias_Eventos` (`evento_id`),
  CONSTRAINT `FK_Convocatorias_Centros` FOREIGN KEY (`centro_id`) REFERENCES `centros` (`centro_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `FK_Convocatorias_Eventos` FOREIGN KEY (`evento_id`) REFERENCES `eventos` (`evento_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 


CREATE TABLE `eventos` (

    ...FIELDS...

  PRIMARY KEY (`evento_id`),
  KEY `evento` (`evento`,`temario`(255))
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci



CREATE TABLE `estad` (

    ...FIELDS...

  CONSTRAINT `FK_Estad_Convocatorias` FOREIGN KEY (`convocatoria_id`) REFERENCES `convocatorias` (`convocatoria_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `FK_Estad_Usuarios` FOREIGN KEY (`usuario_id`) REFERENCES `usuarios` (`usuario_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=360851 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci



CREATE TABLE `usuarios` (

    ...FIELDS...

  PRIMARY KEY (`usuario_id`),
  KEY `FK_Usuarios_WEBS` (`web_id`),
  KEY `usuario` (`usuario`,`clave`),
  KEY `usuario_id` (`usuario_id`,`web_id`),
  CONSTRAINT `FK_usuarios_web_id` FOREIGN KEY (`web_id`) REFERENCES `webs` (`web_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=256323 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci


CREATE TABLE `usuariohist` (

    ...FIELDS...

  PRIMARY KEY (`id`),
  KEY `usuario_id` (`usuario_id`,`fecha`,`id`),
  KEY `usuario_id_2` (`usuario_id`,`fecha`,`id`,`web`,`comentario`(255))
) ENGINE=InnoDB AUTO_INCREMENT=28153 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

インデックスを作成するこのクエリを最適化する方法を知っている人は誰でも、解決策を説明してください。

前もって感謝します!

4

2 に答える 2

2

ほんの2、3の指針-私は今、完全な分析をする時間がありません:

クエリが最大の可能性に到達するために、明示的な値が提供されている場合、それらがクエリを駆動する場合に非常に役立ちます。
クエリにはcentros.segcuponesu.fecha_prox_llamadaの特定の値がありますが、最後のインデックスにはインデックスがなく、最初のインデックスにはジョイントインデックスしかないため、最初の呼び出しポートはu.fecha_prox_llamadaのインデックスを作成することです。たぶん、 centros.segcuponesの単一のインデックスがどのようになるかを見てください。

于 2013-02-12T16:09:29.117 に答える
0

インデックスの質問にはあまりにも多くのものがあります...とにかく...すべての主キーと外部キー、および結合しているすべてのものにインデックスを付ける必要があります...日付に結合している場合は、そのフィールドにもインデックスを付けることができます。また、グループ レベルからメンバー レベルまでインデックスを作成する必要があることにも注意してください。たとえば、メンバーを識別する 3 つのフィールドがある場合は、それらの 3 つのフィールドを使用してインデックスを作成します。ClientCd - ID - Sub_ID を一緒に使用すると、代理キーと一意の識別子が作成されます。これら 3 つのフィールドすべてにインデックスを付けて、その人物に関する人口統計情報を無視しながらデータベース検索を可能な限り効率的にする必要があります...

于 2013-02-12T16:07:37.193 に答える