Ver Mensaje Individual
  #1 (permalink)  
Antiguo 25/02/2011, 05:44
Avatar de SUSMO
SUSMO
 
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años, 7 meses
Puntos: 0
Duda con EXPLAIN en muchos registros

Hola a todos,

En mi pàgina web tengo consultas que con muchos registros me peta por superar el tiempo de ejecución.
Se que esto puedo arreglarlo augmentando el memory_limit de php pero es chapucilla y prefiero optimizar las consultas.

Mirando por inet he visto que existe EXPLAIN para ver como actúan las consultas y aquí viene mi duda.

Tengo la siguiente consulta:
Código MySQL:
Ver original
  1. SELECT typex.*, listM.prtc__col_name as colM, listM.value as valueM, langs.prtc__col_name AS '__colName__',
  2. langs.malg__code AS '__code__',langs.text AS '__text__'
  3. FROM table1 AS typex
  4. LEFT JOIN table2 AS langs ON langs.prtx__ref = typex.ref AND langs.prt__name = 'gafas'
  5. LEFT JOIN table3 AS listM ON listM.prtx__ref = typex.ref AND listM.prt__name = 'gafas'
  6. WHERE typex.ref in ('0010021','0010022','0010023')

Con pocos registros, no hay problema y lo que me devuelve es:

id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, 'SIMPLE', 'typex', 'range', 'PRIMARY', 'PRIMARY', '302', NULL, 3, 'Using where'
1, 'SIMPLE', 'langs', 'ref', 'PRIMARY,Index_3', 'Index_3', '152', 'bassol.typex.ref', 9, ''
1, 'SIMPLE', 'listM', 'ref', 'PRIMARY,Index_2', 'Index_2', '152', 'bassol.typex.ref', 6, ''

Pero con muuuuuuchos registros me devuelve:

id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, 'SIMPLE', 'typex', 'ALL', 'PRIMARY', NULL, NULL, NULL, 2735, 'Using where'
1, 'SIMPLE', 'langs', 'ref', 'PRIMARY,Index_3', 'Index_3', '152', 'bassol.typex.ref', 9, ''
1, 'SIMPLE', 'listM', 'ref', 'PRIMARY,Index_2', 'Index_2', '152', 'bassol.typex.ref', 6, ''

El type me cambia de range a ALL. Mirando el manual de referencia de MySQL, si sale type = "ALL" es muy mala opción, ya que hace que la consulta sea más lenta y suele ser por no tener definido un índice en la tabla.
Esto no es cierto puesto que la clave primaria de table1 es ref, las claves primarias de table2 son prtx__ref,prtc__col_name,prt__name,malg__code donde table1.ref tiene que corresponder a table2.prtx__ref y las claves primarias de table3 son: prtx__ref, prtc__col_name, prt__name, value donde table1.ref tiene que corresponder a table3.prtx__ref.

No entiendo pq me sale type = ALL con muchos registros y con pocos me sale range si en las dos consultas está definidas las claves por igual.
Tampoco se como solucionarlo para optimizar mi consulta.

¿Alguien puede ayudarme?
__________________
Perdida en el mundo del conocimiento