пропустить копирование в таблицу tmp на диске mysql - PullRequest
59 голосов
/ 23 сентября 2011

У меня вопрос к большим запросам mysql.Можно ли пропустить шаг копирования в таблицу tmp на диске , который mysql предпринимает для больших запросов, или это можно сделать быстрее?потому что этот шаг занимает слишком много времени, чтобы вернуть результаты моих запросов.Я прочитал на странице MySQL, что mysql выполняет это для экономии памяти, но меня не волнует сохранение памяти. Я просто хочу получить результаты моих запросов обратно БЫСТРО, у меня достаточно памяти на моей машине.Кроме того, мои таблицы правильно проиндексированы, поэтому это не причина, по которой мои запросы выполняются медленно.

Любая помощь?

Спасибо

Ответы [ 2 ]

84 голосов
/ 23 сентября 2011

Есть две вещи, которые вы можете сделать, чтобы уменьшить влияние этого

ОПЦИЯ # 1: Увеличить переменные tmp_table_size и / или max_heap_table_size

Эти параметры определяют, насколько большой может быть временная таблица в памяти, прежде чем она будет считаться слишком большой, а затем страницы на диск как временная таблица MyISAM. Чем больше эти значения, тем менее вероятно, что вы получите «копирование в таблицу tmp на диске». Пожалуйста, убедитесь, что на вашем сервере достаточно ОЗУ и max_connections имеет умеренную конфигурацию, если для одного соединения с БД требуется много ОЗУ для собственных временных таблиц.

ОПЦИЯ № 2: Использовать RAM-диск для таблиц tmp

Вы должны иметь возможность настроить RAM-диск в Linux, а затем установить tmpdir в mysql как папку, в которой установлен RAM-диск.

Для начала настройте RAM диск в ОС

Создать в Linux папку с именем / var / tmpfs

mkdir /var/tmpfs

Затем добавьте эту строку в / etc / fstab (например, если вы хотите 16 ГБ ОЗУ)

none                    /var/tmpfs              tmpfs   defaults,size=16g        1 2

и перезагрузите сервер.

Примечание: можно создать диск RAM без перезагрузки. Просто не забудьте добавить вышеупомянутую строку в / etc / fstab, чтобы получить RAM-диск после перезагрузки сервера.

Теперь для MySQL:

Добавьте эту строку в /etc/my.cnf

[mysqld]
tmpdir=/var/tmpfs

и перезапустите mysql.

ВАРИАНТ № 3: Получить таблицу tmp на RAM-диск КАК МОЖНО СКОРЕЕ (при условии, что сначала вы применяете ОПЦИЮ № 2)

Возможно, вы захотите как можно быстрее принудительно вставить таблицы tmp на диск RAM, чтобы MySQL не вращал колеса, перемещая большие таблицы tmp в памяти на диск RAM. Просто добавьте это в /etc/my.cnf:

[mysqld]
tmpdir=/var/tmpfs
tmp_table_size=2K

и перезапустите mysql. Это приведет к появлению даже самой маленькой временной таблицы прямо на RAM-диске. Вы можете периодически запускать ls -l /var/tmpfs, чтобы наблюдать, как временные таблицы приходят и уходят.

Дай попробовать !!!

CAVEAT

Если вы видите только временные таблицы в / var / tmpfs 24/7, это может повлиять на функциональность / производительность ОС. Чтобы убедиться, что / var / tmpfs не переполнен, изучите настройку ваших запросов. Как только вы это сделаете, вы должны увидеть меньше материализованных таблиц tmp в /var/tmpfs.

1 голос
/ 04 июня 2019

Вы также можете пропустить копию в таблицу tmp на диске часть (в выбранном ответе нет ответа)

  1. Если вы избегаете некоторых типов данных:

Поддержка типов данных переменной длины (включая BLOB и TEXT), не поддерживаемых MEMORY.

из https://dev.mysql.com/doc/refman/8.0/en/memory-storage-engine.html (или https://mariadb.com/kb/en/library/memory-storage-engine/, если вы используете mariadb).

Если ваша временная таблица достаточно мала: как сказано в выбранном ответе, вы можете

увеличить переменные tmp_table_size и / или max_heap_table_size

Но есливы разделяете запрос на более мелкие запросы (отсутствие запроса не помогает проанализировать вашу проблему), вы можете поместить его во временную таблицу памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...