Улучшение производительности конкретного MySQL-запроса - PullRequest
1 голос
/ 26 апреля 2019

Я использую корпоративное приложение на нескольких сайтах, которое требует использования базы данных.Я не разработчик приложения, поэтому я не могу изменить способ, которым приложение запрашивает базу данных.В настоящее время мы пытаемся перейти с MySQL на PostgreSQL, потому что случается так, что приложение лучше работает на PostgreSQL.

Приложение хранит данные по тысячам таблиц в конкретном экземпляре базы данных.Приложение имеет встроенную функцию миграции, которая передает данные от одного поставщика базы данных (например, MySQL) другому.(например, PostgreSQL) В процессе миграции приложения оно выполняет следующие два запроса для каждой таблицы в экземпляре:

SHOW FULL TABLES FROM 'xxx' LIKE 'DATASERIES_yyy'

SELECT COUNT(1) FROM 'DATASERIES_yyy'

Где «xxx» - это экземпляр базы данных, а «yyy» - произвольный, непоследовательное целое число.

Каждый из перечисленных выше запросов выполняется для каждой таблицы 'DATASERIES_yyy' до того, как фактически начнется миграция данных.Процесс выполнения вышеупомянутых двух запросов является для FAR самым большим узким местом в процессе миграции.Из информационной схемы MySQL видно, что выполнение двух вышеупомянутых запросов занимает в среднем 0,25 секунды, и большая часть этого времени уходит на «проверку разрешений».Это верно для мощных серверов или даже для моего скромного рабочего ноутбука.

Я искал в Интернете способы, которые могут улучшить производительность этих двух запросов.Поскольку я не могу изменить способ, которым приложение запрашивает базу данных, я могу сосредоточиться только на самом MySQL.

Вещи, которые я пытался ускорить: 1. Гарантировано, что innodb_stats_on_metadata выключен.2. Установите innodb_read_io_threads = 64. 3. Гарантированное кеширование запросов отключено.4. Удалены все пользователи, кроме 1 имени пользователя, которое приложение использует для входа в базу данных.5. Установите query_cache_type = 0. 6. Установите innodb_io_capacity = 1000. 7. Буферные пулы давно настроены на использование около 70% серверной памяти.

Я не ожидаю никаких чудес, но есть и другие вещиЯ могу попытаться помочь ускорить этот процесс?

Поскольку база данных MySQL будет отброшена после завершения миграции, я могу использовать нетрадиционные параметры просто для ускорения процесса, поэтому не стесняйтесьдать рекомендации, которые будут считаться временными или краткосрочными.(Очевидно, что целостность данных не может быть нарушена.)

Кстати, я знаю, что не могу использовать innodb_read_only, потому что приложение записывает четыре UPDATES в начале процесса и удаляет их в конце, чтобы оно зналопроцесс начался и закончился правильно.

Все эти сайты являются экземплярами MySQL, работающими в средах Windows.Большинство сайтов работают под управлением MySQL версии 5.7.Другие 5,5.

Любое руководство приветствуется.Спасибо!

Редактировать: 1. Полномочия пользователя устанавливаются глобально, а не для таблицы.2. Нет ничего необычного в том, что 10 000 таблиц DATASERIES_yyy.3. Да, подчеркивание в имени таблицы «DATASERIES_yyy».У меня нет контроля над именами таблиц.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Вещи, которые вы настроили, должны быть либо полезными, либо хотя бы безвредными.

Это предоставит всю информацию за один шаг и может занять всего пару секунд:

USE xxx;
SHOW TABLE STATUS LIKE 'DATASERIES%';

Последний будет перечислять все имена таблиц, оценка количества строк и некоторые другие вещи. Увы, он не обязательно даст вам точное количество строк для таблиц InnoDB; это критично?

Таблицы 10 КБ означают 10 КБ (или более) файлов в одном каталоге. Windows не справляется с большими каталогами; предлагаю переосмыслить необходимость в стольких таблицах.

Были ли все действия выполнены в одном соединении? Или вы переподключились к каждой таблице? Переподключение будет стоить что-то ; невозможно предсказать, сколько.

0 голосов
/ 26 апреля 2019

Разрешения в MySQL могут предоставляться глобально или для каждой таблицы отдельно. Возможно, пользователю этого приложения были предоставлены разрешения для отдельных таблиц, что делает объем данных довольно большим. Это также тот случай, когда разрешения хранятся в базе данных MyISAM (базе данных «mysql»), поэтому ни один из параметров InnoDB не влияет на его производительность.

Используйте команду SHOW GRANTS для проверки прав доступа пользователя. Если таких разрешений очень много, и если вы играете в это, предоставьте эти разрешения на *.* вместо множества отдельных таблиц.

Если это не проблема, то это может быть просто неизбежным побочным эффектом проверки прав доступа для очень большого числа таблиц. Их должно быть очень много, если на четверть секунды на таблицу приходится значительная задержка.

Мне также кажется, что часть LIKE 'DATASERIES_yyy' является шаблоном, если подчеркивание является действительным подчеркиванием. Часть сопоставления с образцом может замедлять работу большого количества таблиц. Единственный способ справиться с этим - переименовать таблицы, чтобы они не содержали подчеркивания.

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