Мы столкнулись с проблемой, когда запрос к таблице, которая содержит примерно 50 миллионов строк и имеет размер индекса 4 ГБ (размер таблицы около 6 ГБ), приводит к тому, что сервер базы данных меняет местами память и резко замедляется. Я почти уверен, что это связано с превышением размера временной таблицы и ее заменой на диск.
Если я обновил свой сервер базы данных с 32 ГБ ОЗУ до 64 ГБ ОЗУ, мне интересно, сможет ли база данных MySQL полностью использовать преимущества этой дополнительной памяти и не менять местами. Я просмотрел несколько переменных (например, KEY_BUFFER_SIZE и т. Д.), И они, похоже, поддерживают значения параметров более 64 ГБ. Однако в документации MySQL указано, что максимальный размер tmp_table_size составляет 4 ГБ.
Так стоило ли обновление памяти? Выиграет ли от этого проблема «запрос большой таблицы» или это не поможет из-за ограничения в 4 ГБ? Я знаю, что есть потенциально другие решения, такие как реструктуризация таблицы для разделения по-разному и т. Д., Но, не меняя ничего в таблице, поможет ли дополнительная память?
Кроме того, вообще, существуют ли какие-либо другие переменные, связанные с памятью, которыми MySQL не сможет воспользоваться при переходе с 32 на 64 ГБ ОЗУ?
Мы используем 64-битный Linux (Ubuntu) в качестве нашего сервера базы данных.
Спасибо, Гален
Да - если вы используете InnoDB и имеете рабочую нагрузку с интенсивным чтением, вы можете полностью использовать преимущества большого объема ОЗУ [при условии, что ваш набор данных уместится в памяти - ваш сервер будет молниеносно быстро].
Я использую MySQL с хранилищем InnoDB на серверах 8-16 ГБ с умещаемым в памяти рабочим набором.
Возможно, стоит потратить немного времени и усилий на исследование причин, по которым система подкачивается, прежде чем тратить деньги на память?
32 ГБ памяти оставляет много доступной памяти даже после загрузки в память всей таблицы, индекса и максимальной таблицы temp_table. При быстром поиске были обнаружены эти два фрагмента документации, которые могут иметь отношение к делу:
Если вы используете InnoDB, наиболее важной переменной для установки является innodb_buffer_pool_size
. Я бы установил его примерно на 80% вашей системной памяти. Когда кеши нагреваются после некоторого использования, ваши наиболее активные данные (рабочий набор данных) будут в памяти (innodb_buffer_pool_size), и ваши операции с ними должны быть очень быстрыми. Имея 64 ГБ памяти, вы определенно можете вместить много всего. Для серверов БД всегда выгодно покупать память.
Если вы думаете, что это связано с созданием очень большой временной таблицы, вы можете рассмотреть способы улучшения запроса, чтобы избежать временных таблиц.
Вы можете опубликовать в Stackoverflow сообщение, содержащее схему, запрос, план объяснения и некоторые детали проблемы.