2013-02-12 7 views
1

이 쿼리는 처음에 반으로 실행되도록 최적화되었습니다.임시 쿼리를 사용하여 제거하고 쿼리 계획에서 filesort를 사용하여 인덱스를 만드는 쿼리를 최적화하십시오.

이제 인덱스를 만드는 실행을 향상시키고 싶지만 방법을 찾지 못했습니다.

쿼리는 : 나는 centros 테이블 (centro_id, 센트로, segcupones)에 커버링 인덱스를 생성 한

*************************** 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) 

하지만 성능이 향상되지 않았습니다

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: 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하지만 성공, 여전히 쿼리 계획 같은에 대한 인덱스를 만들었습니다. 나는 (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 

사람은 내가 인덱스를 생성이 쿼리를 최적화 할 수있는 방법을 알고, 솔루션을 설명해주십시오.

미리 감사드립니다.

답변

2

포인터 그냥 몇 - 나는 전체 분석을 위해 지금 시간이 없어 :

어떤 쿼리 제공하는 명시 적 값이있는 경우가 쿼리를 운전하는 경우는 최대 잠재력은, 그것은 엄청난 도움이 있어요 도달하기 .
귀하의 질의는 centros.segcuponesu.fecha_prox_llamada에 대한 특정 값을 가지고 있지만 마지막에 인덱스, 그리고 처음에 단지 공동 인덱스가 없다, 그래서 전화의 첫 번째 포트는 인덱스를 생성하는 것입니다 u.fecha_prox_llamada에 대해서는 centros.segcupones에 대한 단일 색인이 어떻게 표시되는지보실 수 있습니다.

+0

fecha_prox_llamada의 색인이 작동하지 않아서 파일 설명이 여전히 Explain 결과에 나타납니다.그러나 나는 다른 접근법으로 질의를 재구성하는 것을 해결했다. 고맙습니다 –

+0

@ PacketTracer - 멋지다, 잘 했어 =) – Raad

0

wayyyy 색인 질문에 너무 많은 것들 ... 상관없이 ... 모든 기본 및 외래 키와 당신이 가입하고있는 모든 것에 대한 색인을 생성해야합니다 ... 해당 필드에서 색인을 생성 할 수있는 날짜에 가입하는 경우 게다가. 또한 그룹 레벨에서 회원 레벨까지 색인을 작성하기를 원할 것입니다. 따라서 회원을 식별하는 3 개의 입력란을 말하면 3 개의 입력란을 사용하여 색인을 생성하십시오. ClientCd-ID-Sub_ID를 함께 사용하면 대리 키와 고유 식별자가 만들어 지므로이 세 필드 모두에서 색인을 생성하여 해당 인물에 대한 인구 통계 정보를 무시하면서 가능한 한 효율적으로 데이터베이스를 검색 할 수 있습니다.

+0

기본 키와 외래 키는 기본적으로 인덱스이며 가입 할 모든 것을 인덱싱 할 필요가 없습니다. 이 특정 쿼리의 문제는'u.fecha_prox_llamada'에 인덱스가 없다는 것입니다. –

+0

인덱싱 할 필요가없는 경우가 있습니다. 어떤 경우에는 특정 항목을 인덱싱 할 필요가 없지만이 경우에는 아무 것도 볼 수 없습니다 성능 관점에서 작동하지 않는 이유는 무엇입니까? 특히 날짜 필드에 -이 경우 u.fecha_prox_llamada가 무엇인지, 따라서 DATE 필드에서 JOIN을 명시 적으로 언급 할 때 내 대답이 기술적으로 정확합니다. 입력 해 주셔서 감사합니다. – Hituptony