2015-08-06 1 views
2

У меня есть база данных MySQL, которая имеет несколько таблиц. Запрашиваемый SQL-запрос займет более 5 минут. Одна запрашиваемая таблица - «DeviceInfo» и имеет более 21 миллиона записей.Запрос Mysql занимает более 5 минут

Приложение (C#), выполняющее этот запрос, получает таймаут во время выполнения запроса.

Я увеличил innodb_buffer_pool_size = 64M до 1G в My.ini для MySQl.

Как уменьшить время выполнения.

SELECT DISTINCT(pd.PatientId) FROM DeviceInfo di 
    JOIN DeviceSession ds ON ds.DeviceSessionID = di.ByDevSessionId 
    JOIN UserSession us ON us.UserSessionId = ds.ByUserSessionId 
    JOIN PatientDetails pd ON pd.PatientDetailsId = us.ByPatientId 
    WHERE di.SyncStatus = 0 ORDER BY us.UserStartSessionTime Desc 

Таблица DeviceInfo имеет 21,850,806 записей

+0

У вас есть индекс? Постарайтесь установить его на всех идентификаторах, к которым вы присоединяетесь. Я думаю, что это решит вашу проблему. –

+2

запустите 'explain select ....' и поделитесь результатом с вопросом. –

+1

Можете ли вы предоставить определения таблиц для каждой из этих таблиц? Вы можете сделать это, выполнив команду «SHOW CREATE TABLE my_table;» –

ответ

0

у вас есть индексы тех столбцов, которые вы присоединяетесь и на одном в вашем где предложение? Используйте слово «EXPLAIN SELECT ...» перед вашим запросом и посмотрите, что выводится в mysql cli, что даст вам знать, если он выполняет полное сканирование таблицы или ...

1

Поскольку вы хотите просто проверить отчетливый PatientId из PatientDetails таблицы конвертируйте все Joins к exists который будет иметь более высокую производительность, чем Join

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

SELECT pd.PatientId 
FROM PatientDetails pd 
WHERE EXISTS (SELECT 1 
       FROM UserSession us 
       WHERE pd.PatientDetailsId = us.ByPatientId 
         AND EXISTS (SELECT 1 
            FROM DeviceSession ds 
            WHERE us.UserSessionId = ds.ByUserSessionId 
             AND EXISTS (SELECT 1 
                FROM DeviceInfo di 
                WHERE ds.DeviceSessionID = di.ByDevSessionId 
                  AND di.SyncStatus = 0))) 
GROUP BY pd.PatientId