Hay cosas que no me parecen correctas de tu consulta, por ejemplo:
- Pones condiciones en el FROM que deberían ir en el WHERE.
- Ciertas condiciones implican relaciones que no estás declarando en el FROM
- La existencia de esos valores en ambas tablas, no siendo PKs, hacen inferir que hay un diseño algo defectuoso (redundancia peligrosa) e indices faltantes.
- Hay campos evidentemente numéricos que se están comparando como cadenas, lo que exige una conversión implícita innecesaria (probable defecto de programación).
A mi entender, habría que replantear la consulta con algo así como:
Código MySQL:
Ver original listM.prtx__ref,
prtx_list_m listM
INNER JOIN prtx_prt_prc cat
ON (cat.prtx__ref
= typex.ref
AND listM.prt__name
= cat.prt__name
) INNER JOIN prtx__comentssubs typex
ON typex.ref
= listM.prtx__ref
listM.prt__name = 'comentssubs'
AND listM.prtc__col_name
= 'llmult' AND cat.prc__id
IN (680, 533, 3, 20)
En ese caso por ejemplo, puede inferirse que se requieren al menos cuatro indices para que el tema funcione, sobre los campos:
- prtx_list_m.prt__name
- prtx_list_m.prtc__col_name
- prtx_prt_prc .prc__id
- prtx__comentssubs.public
También es posible que la cosa mejora si en la tabla prtx_list_m se define un índice INDEX sobre (prtx__ref, value)
Por cierto, te recomiendo enfáticamente no usar
palabras reservadas como nombres de columnas, porque eso puede trae consecuencias imprevisibles (por ejemplo, puede producir errores de sintaxis indetectables). Me refiero en especial a ese campo llamado "value".