Mariadb tmp_tables: один и тот же запрос, разное поведение в разных соединениях? - PullRequest
0 голосов
/ 30 апреля 2020

Попытка улучшить производительность сложного запроса с помощью нескольких объединений для больших таблиц. Я использую 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 Возможно, наличие нескольких открытых соединений приводит к тому, что сервер базы данных обрабатывает память по-разному?

...