Оптимизация запросов MySQL для выполнения общего запроса - Как я могу сократить время выполнения запроса?

проблема

У меня есть запрос, который я вставил ниже. Проблема, с которой я сталкиваюсь, заключается в том, как я могу сократить задержку до текущего времени, равного примерно 10 секундам.

set@ csum = 0;
SELECT Date_format(assigneddate, '%b %d %Y') AS assigneddate, (@csum: = @csum + numactionitems) AS totalactionitems
FROM(
    SELECT assigneddate,
    Sum(numactionitems) AS numactionitems FROM(
        SELECT assigneddate,
        Count( * ) AS numactionitems FROM(
            SELECT *
            FROM(
                SELECT actionitemtitle,
                actionitemstatement,
                altownerid,
                approvalstatement,
                assigneddate,
                assignorid,
                closeddate,
                closurecriteria,
                closurestatement,
                criticality,
                duedate,
                ecd,
                notes,
                ownerid,
                Concat(lastname, ', ', firstname) AS owner,
                cnames2.categoryvalue AS `team`,
                cnames2.categorynameid AS `teamid`,
                cnames3.categoryvalue AS `department`,
                cnames3.categorynameid AS `departmentid`,
                cnames4.categoryvalue AS `source`,
                cnames4.categorynameid AS `sourceid`,
                cnames5.categoryvalue AS `project_phase`,
                cnames5.categorynameid AS `project_phaseid`,
                ac1.actionitemid FROM actionitemcategories AS ac1 INNER JOIN actionitems AS a INNER JOIN users AS u INNER JOIN(
                    SELECT actionitemid AS a2id,
                    categorynameid AS c2 FROM actionitemcategories WHERE categoryid = 195) AS ac2 INNER JOIN categorynames AS cnames2 ON cnames2.categorynameid = ac2.c2 AND ac1.categoryid = 195 AND a.actionitemid = ac2.a2id AND ac1.actionitemid = a.actionitemid AND a.ownerid = u.userid INNER JOIN(
                    SELECT actionitemid AS a3id,
                    categorynameid AS c3 FROM actionitemcategories WHERE categoryid = 200) AS ac3 INNER JOIN categorynames AS cnames3 ON cnames3.categorynameid = ac3.c3 AND ac2.a2id = ac3.a3id INNER JOIN(
                    SELECT actionitemid AS a4id,
                    categorynameid AS c4 FROM actionitemcategories WHERE categoryid = 202) AS ac4 INNER JOIN categorynames AS cnames4 ON cnames4.categorynameid = ac4.c4 AND ac3.a3id = ac4.a4id INNER JOIN(
                    SELECT actionitemid AS a5id,
                    categorynameid AS c5 FROM actionitemcategories WHERE categoryid = 203) AS ac5 INNER JOIN categorynames AS cnames5 ON cnames5.categorynameid = ac5.c5 AND ac4.a4id = ac5.a5id) s WHERE 1 = 1) f GROUP BY assigneddate UNION ALL(
            SELECT a.date AS assigneddate,
            0 AS numactionitems FROM(
                SELECT '2015-03-05' + INTERVAL(a.a + (10 * b.a) + (100 * c.a)) day AS date FROM(
                    SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a CROSS JOIN(
                    SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b CROSS JOIN(
                    SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c) a) ORDER BY assigneddate ASC) t GROUP BY assigneddate LIMIT 282) t
WHERE assigneddate != '0000-00-00'

Цель запроса

Цель этого запроса - получить все записи, содержащие значения даты, и собрать текущий счет всех записей, приходящихся на определенную дату. Значения даты вычисляются в sqlfiddle ниже. Его конечной целью является отображение на графике, который принимает промежуточный итог в виде линейного графика. Он будет считать вверх, поэтому это растущий график.

График, на котором я его отображаю, называется графиком построения всех моих записей (элементы действий со значениями даты).

Описание проблемы

Моя проблема в том, что я получаю результаты запроса как минимум за 10 секунд.

Вопрос

Как я могу ускорить и уменьшить задержку запроса, чтобы я не остановил загрузку моего графика?

Полная схема и часть моего запроса, который выполняется успешно

(У меня возникают трудности при запуске основного запроса на sqlfiddle, хотя я могу запустить его со своей машины).

http://sqlfiddle.com/

Любая помощь или предложения будут высоко оценены!

РЕДАКТИРОВАТЬ

ДОБАВЛЕН Образец скриншота моего интерфейса категорий

Категория (первая таблица) имеет поле с именем categoryname, которое предполагает, что одно из 4 значений может быть расширено или удалено, а именно: Team, Department, Source, Project_Phase.

CategoryName (Вторая таблица) имеет поле под названием categoryvalue, которое является фактическим допустимым значением для каждой категории (Первая таблица)

Пример: команда 1, команда 2, команда 3 являются значениями категорий в пределах имени категории и соответствуют категории команды.

категория

категории

1 ответ

Начните с того, что сделайте эту таблицу дат постоянной таблицей, а не подзапросом.

Эта конструкция работает очень плохо и обычно может быть превращена в JOINs без подзапросов:

JOIN ( SELECT ... )
JOIN ( SELECT ... )

Это связано с тем, что в подзапросах нет индекса, поэтому необходимо полное сканирование.

Предоставлять EXPLAIN для всего запроса.

Addenda

PRIMARY KEY это ключ; не добавляйте другой ключ с такими же столбцами.

Схема EAV приводит к сложности и медлительности, с которыми вы сталкиваетесь.

Не использовать TINYTEXT; замедляет работу таблиц tmp в сложных запросах; использование VARCHAR(255), Не использовать VARCHAR(255)использовать VARCHAR с реалистичным пределом.

Зачем вам оба categories а также categorynames?

Другие вопросы по тегам