ответ

0

DML операции на большом столе - очень трудоемкая работа, требует правильного анализа и хороших стратегий миграции при выполнении операций. Предположим, что у вашей базы данных MYSQL у вас есть гигантская таблица с 600 миллионами строк, имеющая некоторую операцию схемы, такую ​​как добавление уникального ключа, изменение столбца, даже добавление еще одного столбца к нему - очень громоздкий процесс, который будет занимать часы для обработки, а иногда и время сервера. Чтобы преодолеть это, нужно придумать очень хороший план миграции, один из которых я записываю ниже.

1) Предположим, что имеется таблица Orig_X, в котором я должен добавить новый столбец colNew со значением по умолчанию как 0.

2) фиктивный таблицы создается Dummy_X, который репликой Orig_X за исключением новой колонки colNew ,

3) Данные вставляются из Orig_X в Dummy_X со следующими настройками.

4) Автоматическая фиксация установлена ​​на ноль, поэтому данные не фиксируются после каждой вставки , что затрудняет выполнение.

5) Двоичные журналы установлены на ноль, так что в этих журналах не будет записано никаких данных.

6) После установки бота данных функция установлена ​​в единицу.

SET AUTOCOMMIT = 0; 
SET sql_log_bin = 0; 

Insert into Dummy_X(col1, col2, col3, colNew) 
Select col1, col2, col3, from Orig_X; 
SET sql_log_bin = 1; 
SET AUTOCOMMIT = 1; 

7) Теперь первичный ключ может быть создан с помощью вновь вставленного столбца, который теперь является частью первичного ключа.

8) Теперь можно создать все уникальные ключи. 9) Мы можем проверить состояние сервера, выполнив следующую команду

SHOW MASTER STATUS 

10) Это также полезно выпустить FLUSH LOGS так MySQL очистит старые журналы.

11) Чтобы повысить производительность для запуска аналогичного типа запросов, таких как вышеприведенный оператор insert, нужно иметь переменную кеша запроса.

SHOW VARIABLES LIKE 'have_query_cache'; 
query_cache_type = 1 

Выше были шаги по миграционной стратегии для большого стола, ниже я Вайтинга так шаги, чтобы улучшить производительность баз данных/запросов. 1) Удалите ненужные индексы на столе, обратите особое внимание на индексы UNIQUE, поскольку они при отключении буферизации изменений. Не используйте индекс UNIQUE, если у вас нет причин для этого ограничения, предпочитайте обычный INDEX.

2) Если объемная загрузка свежей таблицы задерживается, создавая любые индексы, кроме ОСНОВНОГО КЛЮЧА. Если вы создадите их один раз после загрузки данных, то InnoDB сможет применить процесс предварительной сортировки и массовой загрузки, который будет быстрее и приведет к обычно более компактным индексам.

3) Больше памяти может помочь в оптимизации производительности. Если SHOW ENGINE INNODB STATUS показывает какие-либо показания в разделе BUFFER POOL AND MEMORY, а количество свободных буферов (также под BUFFER POOL AND MEMORY) равно нулю, вы можете получить больше преимуществ (при условии, что на вашем сервере вы правильно определили innodb_buffer_pool_size.

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

5) Большинство серверов MySQL имеют кэширование запросов. Это один из самых эффективных методов повышения производительности, который спокойно обрабатывается движком базы данных. Когда один и тот же запрос выполняется несколько раз, результат извлекается из кеша, что довольно быстро.

6) Использование ключевого слова EXPLAIN может дать вам представление о том, что делает MySQL для выполнения вашего запроса. Это может помочь вам выявить узкие места и другие проблемы с вашими запросами или структурами таблиц. Результаты запроса EXPLAIN покажут вам, какие индексы используются, как сканируются и сортируются таблицы и т. Д.

7) Если ваше приложение содержит много запросов JOIN, вам необходимо убедиться, что столбцы, которые вы join by индексируются по обеим таблицам. Это влияет на то, как MySQL внутренне оптимизирует операцию соединения.

8) В каждой таблице есть столбец идентификатора, который является ПЕРВИЧНЫМ КЛЮЧОМ, AUTO_INCREMENT и одним из ароматов INT. Также желательно UNSIGNED, поскольку значение не может быть отрицательным.

9) Даже если у вас есть таблица пользователя с уникальным полем имени пользователя, не делайте этот первичный ключ. Поля VARCHAR в качестве первичных ключей медленнее. И у вас будет лучшая структура в вашем коде, обратившись ко всем пользователям с их идентификатором внутри.

10) Обычно, когда вы выполняете запрос из сценария, он будет ожидать завершения этого запроса до его продолжения. Вы можете изменить это, используя небуферизованные запросы. Это экономит значительную часть памяти с SQL-запросами, которые создают большие результирующие наборы, и вы можете приступить к работе с результирующим набором сразу после того, как была извлечена первая строка, так как вам не нужно ждать, пока не будет выполнен полный запрос SQL.

11) С двигателями базы данных диск, пожалуй, является самым значительным узким местом. Хранение вещей поменьше и компактнее обычно полезно с точки зрения производительности, чтобы уменьшить объем переноса диска.

12) Два основных механизма хранения в MySQL - это MyISAM и InnoDB. У каждого есть свои плюсы и минусы. MYISAM хорош для приложений с большим объемом чтения, но он не очень хорошо масштабируется, когда есть много записей. Даже если вы обновляете одно поле одной строки, вся таблица блокируется, и ни один другой процесс не может даже прочитать его, пока этот запрос не будет завершен. MyISAM очень быстро вычисляет типы запросов SELECT COUNT (*). InnoDB имеет тенденцию быть более сложным механизмом хранения и может быть медленнее, чем MyISAM для большинства небольших приложений. Но он поддерживает блокировку на основе строк, которая масштабируется лучше. Он также поддерживает некоторые дополнительные функции, такие как транзакции.

-1

pt-online-schema-change - это инструмент для таких целей.

+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. – Jatin

+0

@Jatin: этот инструмент разработан специально для «заботы о производительности, когда нам нужно изменить столбец в таблице с миллиардами строк». Почему, по-вашему, это не _answer_? Критики не требуется. Никаких разъяснений не требуется. –

Смежные вопросы