Ваша индексация не так уж плоха для запроса, который вы описали. Что ухудшает вашу производительность, так это то, что обе эти таблицы содержат значительное количество данных в каждой строке. Для запроса нужны элементы из каждой таблицы, которых нет во вторичном индексе, и поэтому большие куски для таблицы, относящейся к указанному элементу, должны быть в пуле буферов innodb. Я не смотрел на точные цифры, однако 1G кажется недостаточным, и ваши описания запроса ускоряются во второй раз, кажется, поддерживают это (особенно с SQL_NO_CACHE
и кэшем запросов отключенным (хорошо, что он отключен) .
Рекомендация 1. Увеличьте размер * 1004. * Посмотрите на SHOW GLOBAL STATUS LIKE 'innodb_buffer_pool%'
и посмотрите количество элементов, удаленных из буфера между запросами.
Если вы действительно застряли в ОЗУ доступны и следуют теме рекомендаций @Drapp по индексам, что позволит использовать пул буферов innodb только с индексами, а не с полной таблицей. С этим innodb_buffer_pool конкурируют другие запросы, поэтому следующие имеют ограниченное глобальное влияние.
Рекомендация 2: (если № 1 нельзя сделать)
ALTER TABLE transaction_item
DROP INDEX item_id
ADD INDEX item_id (item_id, item_rate_id, qty_computed );
ALTER TABLE transaction_customer
ADD INDEX id_type (invoice_id, invoice_type);
Примечание: удалена сортировка, необходима для GROUP BY
. Спасибо Рик