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
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?