У меня есть две схемы, обе идентичны, одна из которых содержит примерно в 5 раз меньше данных, а запросы медленнее в 120 раз с теми же индексами, внешними ключами, сервером базы данных и всем остальным, о чем я мог подумать проверять.
Вот два запроса:
-- Bigger Database, takes .5 seconds, has ~900k and 80 records
select *
from schemaA.bb_quote
inner join schemaA.scb_user
ON scb_user.usr_uid = bb_quote.q_usr_uid
order by q_quoteid desc
limit 20;
-- smaller database, takes 2 minutes, has ~211k and 4 records
select *
from schemaB.bb_quote
inner join schemaB.scb_user
ON scb_user.usr_uid = bb_quote.q_usr_uid
order by q_quoteid desc
limit 20;
Я выполнил следующие команды для объяснения, и объяснения разные.
explain select *
from schemaA.bb_quote
inner join schemaA.scb_user
ON scb_user.usr_uid = bb_quote.q_usr_uid
order by q_quoteid desc
limit 20;
explain select *
from schemaB.bb_quote
inner join schemaB.scb_user
ON scb_user.usr_uid = bb_quote.q_usr_uid
order by q_quoteid desc
limit 20;
Второй заканчивается совсем другим объяснением. Я не уверен, какие дальнейшие шаги отладки предпринять.
Я много раз читал, что это результат того, что им не хватает оперативной памяти, и ему нужно создать файл для своей работы. Это выполняется в AWS RDS, и для мониторинга действительно используется свободное место на жестком диске ~ 20 гигабайт, затем он восстанавливает всю эту память, в то время как другой запрос этого не делает.
Как лучше всего определить, чем отличаются эти две схемы?
Отладка завершена
- Удаляя и перестраивая схему с помощью mysqldump, проблема все еще возникает.
- Удаление и повторное использование внешнего ключа
- Тестирование ~ 12 других одинаковых схем
Дополнительная информация из комментариев
- Версия = MySQL 5.5.46
- q_quoteid находится в таблице bb_quote
- EXPLAIN FORMAT = JSON SELECT не работает, я не думаю, что он поддерживается этой версией MySQL