Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да подобрите производителността на заявките (използвайки резултатите от командата обяснение, например)

Можете да опитате нещо подобно (въпреки че не е практично за мен да тествам това)

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

Така че се надявам да не съм объркал нещо.

Както и да е, идеята е във вътрешната заявка да изберете само редовете, от които се нуждаете въз основа на вашето условие where. Това ще създаде по-малка tmp таблица, тъй като изтегля само 2 полета и двете int.

След това във външната заявка се присъединявате към таблиците, от които всъщност извличате останалите данни, подреждате и групирате. По този начин вие сортирате и групирате върху по-малък набор от данни. И вашата клауза where може да работи по най-оптималния начин.

Може дори да сте в състояние да пропуснете някои от тези таблици, тъй като изтегляте само данни от няколко от тях, но без да видите пълната схема и как е свързана, е трудно да се каже.

Но най-общо казано тази част (подзаявката)

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

Е това, което е пряко засегнато от вашата клауза WHERE. Вижте, за да можем да оптимизираме тази част, след което да я използваме, за да обединим останалите данни, от които се нуждаете.

Пример за премахване на таблици може лесно да бъде изведен от горното, помислете за това

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 таблица cluster никога не се използва за изтегляне на данни от, само за къде. Така че не е

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

Същото или еквивалентно на

WHERE
    sc.cluster_id=?

И следователно можем да премахнем това присъединяване напълно.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Неправилен ред на ръководството

  2. Mysql как да обединя таблици

  3. MySQL претеглена средна стойност в една заявка

  4. INSERT IGNORE с помощта на Laravel's Fluent

  5. MySQL:Едновременни актуализации (чрез нишки) на проста таблица