Оптимизация запросов MySql без подзапроса

Может ли кто-нибудь помочь мне оптимизировать этот запрос?

SELECT distinct t.designation,
      (SELECT sum(time_to_sec(timediff(outtime,intime))) 
       FROM onlinetime where datecreated BETWEEN '2012-01-01 00:00:01' 
       AND '2012-12-31 23:59:59' and designation=t.designation) as totsec
FROM onlinetime t;

Я пытаюсь получить обозначение и количество секунд из таблицы onlinetime. Он имеет только 8000 записей, но вышеупомянутый запрос требует много времени для выполнения. Есть ли другой способ оптимизировать это?

1
nl ja de

2 ответы

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

SELECT  designation, sum(time_to_sec(timediff(outtime,intime))) totsec
FROM    onlinetime
WHERE   datecreated BETWEEN '2012-01-01 00:00:01' AND '2012-12-31 23:59:59'
GROUP   BY designation

просто добавьте индекс для столбца datecreated для повышения производительности.

ALTER TABLE onlinetime ADD INDEX (datecreated)

или, может быть, вы хотите этого,

SELECT  a.designation, 
        COALESCE(sum(time_to_sec(timediff(b.outtime,b.intime))), 0) totsec
FROM    onlinetime a
        LEFT JOIN onlinetime b
            ON  a.designation = b.designation AND
                b.datecreated BETWEEN '2012-01-01 00:00:01' AND '2012-12-31 23:59:59'
GROUP   BY a.designation
3
добавлено
Добро пожаловать : D
добавлено автор John Woo, источник
это то, что я хочу ... Спасибо за ваше время ...
добавлено автор user1854007, источник

Правильный ответ:

SELECT t.designation,
       sum(case when datecreated between '2012-01-01 00:00:01' AND '2012-12-31 23:59:59'
                then sum(time_to_sec(timediff(outtime,intime)
           end) as totsec
from onlinetime t
group by t.designation

Включение фильтрации в предложение where не совпадает с намерением исходного запроса, который должен содержать все «обозначения» в таблице.

0
добавлено
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)