Myquery занимает слишком много времени в mysql

В моей таблице transactionDetail содержится 300 миллионов данных. Для получения данных для моего запроса требуется очень много времени.

Ниже мой запрос

 select 
 MerchantId as y_m,BoothId ,
 TransactionTypeId , 
 count(Amount) , 
 sum(Amount)  
 from TransactionDetail  
 where TransactionDate>='2014-02-26' 
 and TransactionDate<'2019-02-27' 
 and not (BoothId like 'TEST%')  
 and MerchantId in (select MerchantId from MerchantGroup where  MerchantClassId='MD-SAFAL') 
 group by MerchantId, BoothId, TransactionTypeId 
 order by y_m asc, BoothId asc, TransactionTypeId asc;

Таблица TransactionDetail имеет следующие ключи и индексы

  • ПЕРВИЧНЫЙ КЛЮЧ (TransactionId),

Индексы ниже

  • КЛЮЧ idxTransactionDetail003 (MerchantId),

  • КЛЮЧ idxTransactionDetail004 (TransactionDate)

Таблица MerchantGroup имеет индекс в столбце MerchantId

Добро пожаловать в stackoverflow.com. Здесь есть много вопросов по оптимизации запросов - найдите время, чтобы прочитать некоторые из них. Обратите внимание, какие из них проголосовали за или против / закрыты, и причины этого. Обратите внимание, на какие из них были даны полезные ответы. Вы описали немного схемы, задействованной в запросе (но не все), но не предоставили подробностей ни о распределении данных, ни о метриках. Отправной точкой для оценки производительности запросов всегда должен быть план EXPLAIN.

symcbean 06.03.2019 13:27
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
1
35
1

Ответы 1

вы можете добавить составной индекс для столбцов TransactionDetail ( MerchantId, TransactionDate, BoothId )

и вы можете использовать внутреннее соединение вместо предложения IN

и используйте not like вместо not (like)

    select d.MerchantId as y_m
    ,d.BoothId 
    ,d.TransactionTypeId 
    , count(d.Amount) , sum(d.Amount)  
    from TransactionDetail d
    INNER JOIN (
        select MerchantId 
        from MerchantGroup 
        where MerchantClassId='MD-SAFAL'
    ) t t.MerchantId = d.MerchantId
    where d.TransactionDate>='2014-02-26' 
        and d.TransactionDate<'2019-02-27' 
    and d.BoothId not like 'TEST%'  
    group by d.MerchantId, d.BoothId, d.TransactionTypeId 
    order by y_m asc, d.BoothId asc, d.TransactionTypeId asc;

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