Попытка улучшить производительность сложного запроса с помощью нескольких объединений для больших таблиц. Я использую Cake PHP для подключения к двум различным базам данных.
Большой запрос использует базу данных A. В качестве эксперимента я попытался использовать одно соединение с базой данных и использовать его для выполнения всех запросов. По практическим соображениям я использовал для этого соединение с базой данных B и дал этому пользователю привилегии и для базы данных A. Затем я переписал запрос, включив имя базы данных в таблицы: select * from database_a.table_name
et c.
По какой-то причине большой запрос был на 50% быстрее при подключении к этой базе данных!
Я пытался отслеживать, что делает сервер, и вот что я нашел:
Соединение с базой данных A:
1588267087 - checking query cache for query
1588267087 - statistics
1588267087 - Creating tmp table
1588267087 - Sorting for group
1588267087 - Copying to tmp table
1588267097 - Sorting result
1588267097 - Sending data
Соединение с базой данных B:
1588266997 - checking query cache for query
1588266997 - statistics
1588266997 - preparing
1588266997 - Creating tmp table
1588266997 - Copying to tmp table
1588267000 - converting HEAP to Aria
1588267001 - Copying to tmp table on disk
1588267002 - Creating sort index
1588267003 - Copying to group table
1588267004 - Sorting result
1588267004 - Sending data
Как видите, во втором случае отправка данных занимает около 7 секунд; в первом случае требуется 10.
Для обоих подключений я сейчас использую одного и того же (root) пользователя, который обладает полными привилегиями. Со стороны Cake PHP все параметры и параметры соединения выглядят одинаково.
Мои вопросы: почему сервер базы данных обрабатывает один и тот же запрос по-разному? И как второй случай намного быстрее, когда он указывает на создание временных таблиц на диске?
ОБНОВЛЕНИЕ:
Некоторые дополнительные выводы. После увеличения tmp_table_size
и max_heap_table_size
соединение B прекратило создавать таблицу tmp на диске, но продолжало работать значительно быстрее:
1588274488 - checking query cache for query
1588274488 - optimizing
1588274488 - statistics
1588274488 - preparing
1588274488 - Creating tmp table
1588274488 - Copying to tmp table
1588274492 - Creating sort index
1588274494 - Copying to group table
1588274494 - Sorting result
1588274494 - Sending data
Я также обнаружил, что некоторые очень быстрые операции могут быть не включены в приведенное выше, поскольку я получаю его путем многократного опроса show full processlist
Самое главное, теперь я обнаружил, что если настроены оба соединения A и B, большой запрос будет медленным, даже если он использует соединение B Возможно, наличие нескольких открытых соединений приводит к тому, что сервер базы данных обрабатывает память по-разному?