MySQL no optimiza el WHERE, por lo que no es buena idea usar JOIN implícitos (la coma), sino explícitos. El FROM si es optimizado y por ello cuando tienes muchos registros, la performance de un INNER JOIN es usualmente superior.
Con el JOIN implícito es posible que haga una lectura de tipo full table scan, lo que es espantoso, y en algunos casos puede generar productos cartesianos (el peor escenario).
En lugar de eso, el INNER JOIN va devolviendo sólo los registros oincidentes, basados en un indice de FK, cuando las foreign key se han definido (es recomendable no usar tablas MyISAM en este tipo de relaciones).
Por otro lado, el GROUP BY es una cláusula asesina de la performance, ya que s eaplica al resultado luego de ser leído. Es preferible para tu caso usar el DISTINCT, que va descartando repeticiones mientras las recupera, en lugar de hacerlo al final.
La idea sería mas o menos así:
Código SQL:
Ver originalSELECT DISTINCT
DC.dir_cat_id, DC.dir_cat_nombre
FROM
dir_categ DC
INNER JOIN dir_rubro_x_cat DRC ON DC.dir_cat_id = DRC.dir_cat_id
INNER JOIN dir_rubro_x_empr DRE ON DRC.dir_rubro_id = DRE.dir_rubro_id
INNER JOIN dir_empresa DE ON DRE.dir_empr_id = DE.dir_empr_id ;