Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara meningkatkan kinerja kueri (menggunakan menjelaskan hasil perintah f.e.)

Anda dapat mencoba sesuatu seperti ini (walaupun tidak praktis bagi saya untuk menguji ini)

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

Jadi saya harap saya tidak mengacaukan apa pun.

Bagaimanapun, idenya adalah dalam kueri dalam Anda hanya memilih baris yang Anda butuhkan berdasarkan kondisi di mana Anda. Ini akan membuat tabel tmp yang lebih kecil karena hanya menarik 2 bidang di kedua int.

Kemudian di kueri luar, Anda bergabung dengan tabel tempat Anda sebenarnya menarik sisa data, urutan, dan grup. Dengan cara ini Anda mengurutkan dan mengelompokkan pada kumpulan data yang lebih kecil. Dan klausa where Anda dapat berjalan dengan cara yang paling optimal.

Anda bahkan mungkin dapat menghilangkan beberapa tabel ini sebagai satu-satunya pengambilan data dari beberapa tabel, tetapi tanpa melihat skema lengkap dan bagaimana keterkaitannya, sulit untuk dikatakan.

Tapi secara umum bagian ini (Sub-query)

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

Adalah apa yang secara langsung dipengaruhi oleh klausa WHERE Anda. Lihat agar kami dapat mengoptimalkan bagian ini kemudian menggunakannya untuk menggabungkan sisa data yang Anda butuhkan.

Contoh menghapus tabel dapat dengan mudah disimpulkan dari atas, pertimbangkan ini

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 tidak pernah digunakan untuk menarik data dari, hanya untuk di mana. Jadi bukan

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

Sama dengan atau setara dengan

WHERE
    sc.cluster_id=?

Dan karena itu kita dapat menghilangkan gabungan itu sepenuhnya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cara mengatur array sebagai variabel pengguna mysql

  2. menghitung jumlah waktu tipe menggunakan sql

  3. Membuat baris tidak aktif di MySQL

  4. Bagaimana cara memeriksa apakah INSERT berjalan dengan baik dalam fungsi tersimpan?

  5. mysql bergabung bersyarat tergantung pada kolom