2012-10-05 6 views
0

Je cette requête MySQL qui est très lent, je suppose à cause de tout le JOIN (il semble compliqué, mais il est une question de beaucoup de tables):Améliorez cette très lent MySQL SELECT

SELECT DISTINCT doctors.doc_id, 
    doctors.doc_user, 
    doctors.doc_first, 
    doctors.doc_last, 
    doctors.doc_email, 
    doctors.doc_notes, 
    titles.tit_name, 
    specializations.spe_name, 
    activities.act_name, 
    users.use_first, 
    users.use_last, 
    (SELECT COUNT(*) FROM locations WHERE locations.loc_doctor = doctors.doc_id) AS loc_count, 
    (SELECT COUNT(*) FROM reception WHERE reception.rec_doctor = doctors.doc_id) AS rec_count, 
    (SELECT COUNT(*) FROM visits INNER JOIN reports ON visits.vis_report = reports.rep_id WHERE visits.vis_doctor = doctors.doc_id AND reports.rep_user LIKE '%s') AS vis_count 
FROM 
    doctors 
INNER JOIN titles ON titles.tit_id = doctors.doc_title 
INNER JOIN specializations ON specializations.spe_id = doctors.doc_specialization 
INNER JOIN activities ON activities.act_id = doctors.doc_activity 
LEFT JOIN locations ON locations.loc_doctor = doctors.doc_id 
INNER JOIN users ON doctors.doc_user = users.use_id 
WHERE 
    ((doctors.doc_last LIKE %s) OR (doctors.doc_first LIKE %s) OR (doctors.doc_email LIKE %s)) 
    AND doctors.doc_user LIKE %s 
    AND locations.loc_province LIKE %s 
    AND doctors.doc_specialization LIKE %s 
    AND doctors.doc_activity LIKE %s 
ORDER BY %s 

Toutes les % s sont des paramètres dans une fonction PHP sprintf()
La chose la plus importante à noter est ... que je n'ai pas d'index sur MySQL! Je suppose que je peux accélérer le processus en ajoutant quelques index ... mais quoi et où? Il y a tellement de jointures et de paramètres de recherche que je suis dans la confusion quant à ce qui serait efficace :-)

Pouvez-vous m'aider? Merci d'avance!

+0

peut vous envoyer un plan d'exécution? 'EXPLAIN query' –

Répondre

0

Vous pouvez commencer par ajouter des index sur les colonnes que vous utilisez dans la condition where. En outre, vous devez indexer les champs qui sont utilisés dans les colonnes jointes, c'est-à-dire les clés primaires et les clés étrangères.

Je suggérerais que l'expérimentation progressive de ces index donnerait un véritable coup de fouet aux performances.

En outre, j'ai observé que vous récupérez trop de données dans une seule requête. Si ce n'est pas vraiment nécessaire, divisez-le en différents rapports et pages (si possible) car même si vous faites une indexation correcte, la solution ne sera pas tout à fait modulable et ne pourra pas gérer une grande quantité de données.

Note:. Vous pourriez avoir à créer un index en texte intégral sur les champs que vous interrogez par « % » qualificatif (. I.e. utiliser l'opérateur LIKE)