Nano Hash - криптовалюты, майнинг, программирование

Производительность MySQL при добавлении столбца в большую таблицу

У меня MySQL 5.5.37 с InnoDB, установленным локально с помощью apt-get на Ubuntu 13.10. Моя машина - i7-3770 + 32 ГБ памяти + жесткий диск SSD на моем рабочем столе. Для таблицы mytable, содержащей всего 1,5 миллиона записей, следующий DDL-запрос занимает более 20 минут (!):

ALTER TABLE mytable ADD some_column CHAR(1) NOT NULL DEFAULT 'N';

Есть ли способ его улучшить? Я проверил

show processlist;

и он показывал, что по какой-то причине копирует мою таблицу. Это очень неудобно. Есть ли способ отключить эту копию? Есть ли другие способы повысить производительность добавления столбца в большую таблицу?

В остальном моя БД относительно мала, размер дампа всего 1,3 ГБ. Поэтому он должен (по идее) на 100% умещаться в памяти.

Есть ли настройки, которые могут помочь? Изменит ли что-нибудь для меня переход на Precona?

Добавить: у меня есть

innodb_buffer_pool_size = 134217728


Ответы:


1

Есть ли другие способы повысить производительность добавления столбца в большую таблицу?

Короткий ответ: нет. Вы можете добавить значения ENUM и SET мгновенно, и вы можете добавить вторичные индексы при блокировке только для записи, но для изменения структуры таблицы всегда требуется копия таблицы.

Длинный ответ: ваша настоящая проблема не в производительности, а во времени блокировки. Неважно, медленный ли он, важно только то, что другие клиенты не могут выполнять запросы, пока ваш ALTER TABLE не будет завершен. В этом случае есть несколько вариантов:

  1. Вы можете использовать pt-online-schema-change из набора инструментов Percona. Сначала сделайте резервную копию ваших данных! Это самое простое решение, но оно может работать не во всех случаях.

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

  3. Если вам легко создавать реплики, например, если вы размещены в Amazon RDS, вы можете создать реплику мастер-мастер, запустить там таблицу изменений, позволить ей снова синхронизироваться и переключить экземпляры после завершения.

ОБНОВЛЕНИЕ

Как уже упоминалось, в MySQL 8.0 INNODB добавлена ​​поддержка мгновенного добавления столбцов. Это не волшебное решение, у него есть ограничения и побочные эффекты - это может быть только последний столбец, таблица не должна иметь полнотекстовый индекс и т. Д. - но во многих случаях может помочь.

Вы можете указать явные ALGORITHM=INSTANT LOCK=NONE параметры, и если мгновенное изменение схемы невозможно, MySQL выйдет из строя с ошибкой вместо возврата к INPLACE или COPY. Пример:

ALTER TABLE mytable
ADD COLUMN mycolumn varchar(36) DEFAULT NULL,
ALGORITHM=INPLACE, LOCK=NONE;

https://mysqlserverteam.com/mysql-8-0-innodb-now-supports-instant-add-column/

09.07.2014
  • Вы можете использовать [pt-online-schema-change] [1] из набора инструментов Percona. Сначала сделайте резервную копию ваших данных! Это самое простое решение, но оно может работать не во всех случаях. - это очень хороший совет 10.07.2014

  • 2

    MariaDb 10.3, MySQL 8.0 и, возможно, другие последующие варианты MySQL имеют функцию «Instant ADD COLUMN», благодаря которой большинство столбцов (есть несколько ограничений, см. Документацию) могут быть добавлены мгновенно без перестройки таблицы.

    20.11.2017
  • MySQL 8 теперь поддерживает это с 8 мая 2018 12.07.2018

  • 3

    Я знаю, что это довольно старый вопрос, но сегодня я столкнулся с аналогичной проблемой. Я решил создать новую таблицу и импортировать старую таблицу в новую таблицу. Что-то типа:

    CREATE TABLE New_mytable  LIKE mytable ;
    
    ALTER TABLE New_mytable  ADD some_column CHAR(1) NOT NULL DEFAULT 'N';
    
    insert into New_mytable  select * from mytable ;
    

    потом

    START TRANSACTION;
    insert into New_mytable  select * from mytable where id > (Select max(id) from New_mytable) ;
    
    RENAME TABLE mytable TO Old_mytable;
    
    RENAME TABLE New_mytable TO mytable;
    COMMIT;
    

    Это не ускоряет процесс обновления, но минимизирует время простоя.

    Надеюсь это поможет.

    07.11.2019
  • Большое Вам спасибо. Но это лучший способ пойти? Я пробую другое решение, но все еще не нашел. :) 23.06.2020
  • Это самый быстрый способ добавить столбец в большую таблицу и перестроить ее. Также почти нет простоев. Если вы используете MySQL 8.0 или выше, вы можете попробовать решение ColinM. 24.06.2020
  • При использовании этого подхода следует иметь в виду, что на момент написания этого комментария оператор CREATE TABLE ... LIKE не создает точную копию таблицы. Например, конфигурации внешних ключей не копируются в новую таблицу. Из документов: dev.mysql.com/doc/ refman / 5.7 / ru / create-table-like.html 29.06.2021


  • 5

    Невозможно избежать копирования таблицы при добавлении или удалении столбцов из-за изменения структуры. Вы можете добавлять или удалять вторичные индексы без копии таблицы.

    Данные вашей таблицы не находятся в памяти. Индексы могут находиться в памяти.

    1,5 миллиона записей - это не много строк, а 20 минут кажутся довольно длинными, но, возможно, ваши строки большие и у вас много индексов.

    Пока таблица копируется, вы все еще можете выбирать строки из таблицы. Однако, если вы попытаетесь выполнить какие-либо обновления, они будут заблокированы до завершения ALTER.

    09.07.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..