sql >> Database teknologi >  >> RDS >> Mysql

Hvordan man forbedrer forespørgselsydeevne (ved at bruge forklar kommandoresultater f.eks.)

Du kan prøve noget som dette (selvom det ikke er praktisk for mig at teste dette)

SELECT
    sac.surveyId,
    q.cat,
    SUM((sac.answer_id*q.weight))/SUM(q.weight) AS score,
    user.division_id,
    user.unit_id,
    user.department_id,
    user.team_id,
    division.division_name,
    unit.unit_name,
    dpt.department_name,
    team.team_name
FROM survey_answers_cache sac
    JOIN
    (
        SELECT
            s.surveyId,
            sc.subcluster_id
        FROM
            surveys s
            JOIN subcluster sc ON s.subcluster_id = sc.subcluster_id
            JOIN cluster c ON sc.cluster_id = c.cluster_id
        WHERE
            c.cluster_id=? AND sc.subcluster_id=? AND s.active=0 AND s.prepare=0
    ) AS v ON v.surveyid = sac.surveyid
    JOIN user ON user.user_id = sac.user_id
    JOIN questions q ON q.question_id = sac.question_id
    JOIN division ON division.division_id = user.division_id
    LEFT JOIN unit ON unit.unit_id = user.unit_id
    LEFT JOIN department dpt ON dpt.department_id = user.department_id
    LEFT JOIN team ON team.team_id = user.team_id
GROUP BY user.team_id, v.surveyId, q.cat
ORDER BY v.surveyId, user.team_id, q.cat ASC

Så jeg håber ikke, jeg har rodet noget ud.

I hvert fald er ideen i den indre forespørgsel, at du kun vælger de rækker, du har brug for, baseret på din where-tilstand. Dette vil skabe en mindre tmp-tabel, da den kun trækker 2 felter begge ints.

Så i den ydre forespørgsel slutter du dig til de tabeller, som du faktisk trækker resten af ​​data fra, rækkefølge og gruppere. På denne måde sorterer og grupperer du på et mindre datasæt. Og din where-klausul kan køre på den mest optimale måde.

Du kan endda være i stand til at udelade nogle af disse tabeller, da du kun trækker data fra nogle få af dem, men uden at se det fulde skema og hvordan det er relateret, er det svært at sige.

Men generelt set denne del (underforespørgslen)

SELECT
    s.surveyId,
    sc.subcluster_id
FROM
    surveys s
    JOIN subcluster sc ON s.subcluster_id = sc.subcluster_id
    JOIN cluster c ON sc.cluster_id = c.cluster_id
WHERE
    c.cluster_id=? AND sc.subcluster_id=? AND s.active=0 AND s.prepare=0

Er det, der er direkte påvirket af din WHERE-klausul. Se, så vi kan optimere denne del, og brug den derefter til at samle resten af ​​de data, du har brug for.

Et eksempel på fjernelse af tabeller kan let udledes af ovenstående, overvej dette

SELECT
    s.surveyId,
    sc.subcluster_id
FROM
    surveys s
    JOIN subcluster sc ON s.subcluster_id = sc.subcluster_id
WHERE
    sc.cluster_id=? AND sc.subcluster_id=? AND s.active=0 AND s.prepare=0

c tabel cluster bruges aldrig til at trække data fra, kun for hvor. Så er det ikke

    JOIN cluster c ON sc.cluster_id = c.cluster_id
 WHERE
    c.cluster_id=?

Det samme som eller svarende til

WHERE
    sc.cluster_id=?

Og derfor kan vi helt fjerne den joinforbindelse.



  1. Indsættelse af Postgres' json-kolonne ved hjælp af wildfly

  2. Brug af DateTime i en SqlParameter til Stored Procedure, formateringsfejl

  3. Sådan vedhæftes en mysql-databasefil

  4. Hvordan opretter man en TRIGGER i SEQUELIZE (nodeJS)?