I have a SQL query like this and I would need to redefine it or using indexes would help I believe, but I do not know which columns include into indexes.
b_answers
has approx. tens of thousand of rowsb_projects
has approx. thousands of rowsb_users
has tens of rows
These AS count_*
columns are needed for sorting.
SELECT
p.id,
p.datetime,
u.name AS u_name,
p.name,
p.note,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND changed != '0000-00-00 00:00:00') AS count_filled,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND started = '1') AS count_started,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id) AS count_sent,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '1' AND changed != '0000-00-00 00:00:00') AS count_filled_quiz1_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '2' AND changed != '0000-00-00 00:00:00') AS count_filled_quiz1_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '1' AND started = '1') AS count_started_quiz1_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '2' AND started = '1') AS count_started_quiz1_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '1') AS count_sent_quiz1_a
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '2') AS count_sent_quiz1_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '3' AND changed != '0000-00-00 00:00:00') AS count_filled_quiz3_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '4' AND changed != '0000-00-00 00:00:00') AS count_filled_quiz3_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '3' AND started = '1') AS count_started_quiz3_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '4' AND started = '1') AS count_started_quiz3_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '3') AS count_sent_quiz3_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '4') AS count_sent_quiz3_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '5' AND changed != '0000-00-00 00:00:00') AS count_filled_quiz5_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '6' AND changed != '0000-00-00 00:00:00') AS count_filled_quiz5_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '5' AND started = '1') AS count_started_quiz5_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '6' AND started = '1') AS count_started_quiz5_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '5') AS count_sent_quiz5_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '6') AS count_sent_quiz5_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '7' AND changed != '0000-00-00 00:00:00') AS count_filled_quiz7_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '8' AND changed != '0000-00-00 00:00:00') AS count_filled_quiz7_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '7' AND started = '1') AS count_started_quiz7_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '8' AND started = '1') AS count_started_quiz7_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '7') AS count_sent_quiz7_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '8') AS count_sent_quiz7_b
FROM
b_projects p
LEFT JOIN
b_answers a ON a.project = p.id
LEFT JOIN
b_users u ON u.id = p.admin
GROUP BY
p.nazev