Оптимизация SQL запроса (Copying To Tmp Table)

330
23 декабря 2016, 13:43

Как можно оптимизировать данный запрос ?

SELECT InstanceID, max(Slot) as slot,
       (SELECT reseller
        FROM `mod_TeamSpeak3Statistics_instance`
        WHERE`InstanceID` = mod_TeamSpeak3Statistics_data.InstanceID) as 'reseller',
       (SELECT partner
        FROM `mod_TeamSpeak3Statistics_instance`
        WHERE`InstanceID` = mod_TeamSpeak3Statistics_data.InstanceID) as 'partner', 
       `Timestamp` AS 'date'
FROM `mod_TeamSpeak3Statistics_data`
WHERE DATE_FORMAT(FROM_UNIXTIME(`Timestamp`), '%Y-%m-%d') ='2016-12-18'
GROUP by DATE_FORMAT(FROM_UNIXTIME(`Timestamp`), '%Y-%m-%d'),InstanceID 
ORDER BY InstanceID ASC

Профилирование:

Answer 1
  1. Убрать подзапросы
  2. Минимизировать использование полей в выражениях. (Не знаю насколько MySQL здесь отличается от MS SQL, но логично, что вычислить пару констант проще, чем применять преобразование к каждой строке)

    SELECT InstanceID, max(Slot) as slot,
    i.reseller,
    i.partner,
    Timestamp AS 'date'
    FROM mod_TeamSpeak3Statistics_data d
    JOIN mod_TeamSpeak3Statistics_instance i ON i.InstanceID = d.InstanceID
    WHERE Timestamp BETWEEN UNIX_TIMESTAMP('2016-12-18 00:00:00') AND UNIX_TIMESTAMP('2016-12-18 23:59:59')
    GROUP by DATE_FORMAT(FROM_UNIXTIME(Timestamp), '%Y-%m-%d'), InstanceID
    ORDER BY InstanceID ASC

Answer 2
SELECT md.InstanceID, 
       max(md.slot) as 'slot',
       mi.reseller as 'reseller',
       mi.partner as 'partner', 
       md.Timestamp AS 'date'
FROM mod_TeamSpeak3Statistics_data md, mod_TeamSpeak3Statistics_instance mi
WHERE DATE_FORMAT(FROM_UNIXTIME(md.Timestamp), '%Y-%m-%d') ='2016-12-18'
AND md.InstanceID = mi.InstanceID
GROUP by 5, 1
ORDER BY 1 ASC

Проиндексировать InstanceID если то не PK в mod_TeamSpeak3Statistics_data Приложить план запроса, что б вам помогли правильно оптимизировать запрос.

Answer 3

UDP после удаления индекса InstanceID для таблицы mod_TeamSpeak3Statistics_data данный запрос выполняется за 0.1990 сек (В среднем 0.2300 сек)

SELECT 
d.InstanceID, 
max(d.Slot) as slot,
max(d.Online) as Online,
i.reseller,
i.partner,
Timestamp
FROM mod_TeamSpeak3Statistics_data d
JOIN mod_TeamSpeak3Statistics_instance i ON i.InstanceID = d.InstanceID
WHERE Timestamp between UNIX_TIMESTAMP('2016-12-20 00:00:00') and UNIX_TIMESTAMP('2016-12-20 23:59:59')
GROUP by DATE_FORMAT(FROM_UNIXTIME(d.Timestamp), '%Y-%m-%d'), d.InstanceID
ORDER BY 1 ASC

План запроса:

Профилирование:

Какие варианты оптимизации существуют ещё ?

READ ALSO
Достать логин по id

Достать логин по id

Имею следующий запрос для вывода данных в таблицу:

236
Установка связей в таблице mySQL

Установка связей в таблице mySQL

Ребята, помогите, разобраться на пальцах(ситуацию упростил до самой сути)

318
INSERT работает, а SELECT нет

INSERT работает, а SELECT нет

Пробовал через mysql тоже самое

268