algunas preguntas:
¿qué motor de tablas usas, InnoDB o MyIsam?
Si usas MyIsam, ¿tienes indexados los FK, es decir, esos, n

suario, num_usuario, y usuario, excepto el usuario de la tabla usuario, pues imagino que ese lo tendrás como PK.
USUARIO ---> NU_USUARIO
AP_USUARIOS-----> NU_USUARIO
AVISOS--------> NUM_USUARIO
DIR_USUARIOS-----> USUARIO
Si los indexas, ganarás en velocidad.
El otro problema que veo es que quieres tener la posibilidad de buscar por población, teléfono y nombre. El campo donde va el nombre, el teléfono y población también deberían ir indexados, pero es que además deberías configurar la consulta dependiendo de lo que se pida, sea nombre solamente, (lo que podría arrastrar varias direcciones), teléfono, y población. La población es de direcciones, mientras que teléfono es de usuario. Si solo pasas un parámetro para teléfono, deberías buscar sólo en la tabla usuario; Si la población forma parte de la consulta, tendrás que relacionar con dir_usuarios, pero ojo, un usuario podría tener dos direcciones distintas en la misma localidad (si el detalle de cada dirección no importa, no hay problema, pues te traes el identificador del usuario, pero si quieres poner todas las direcciones, el group by por n

suario, no te dejará. Yo, en tu caso, armaría consultas distintas de acuerdo con los valores pasados por POST. Danos los datos de las consultas según 1, 2 o 3 parámetros y qué querrías mostrar. Nosotros te orientaremos sobre esas posibles consultas y en el foro PHP lo harán sobre los demás aspectos. Dinos también si querrás mostrar otros datos, porque una vez sacado el num podríamos hacer subconsultas sobre los demás datos que quizás mejoraran esos LEFT JOIN de todas las tablas con todos los campos. Primero nos traemos los 2, 5 o 10 datos de la consulta y con subconsulta le añadimos lo demás.