mysql: как быстрее вставить в таблицу со многими индексами? - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть таблица разделов с примерно 50 индексами, и я вставлю около 20 миллионов записи каждый день.

Каждый раз, когда я звоню insert into tableA values (..),(..)..., чтобы вставить 2000 записей. Это займет около пяти часов. Я не могу загрузить данные из файла. Поэтому я создаю таблицу talbeB так же, как tableA, но tableB не имеет индекса. Сначала я вставляю данные в tableB, затем звоню insert into tableA select * from tableB where mydate = 20181119. первый этап стоит около 40 минут, второй этап около часа.

Я хочу знать, есть ли способ быстрее. Большое спасибо!

1 Ответ

0 голосов
/ 20 ноября 2018
  • Не индексируйте флаги или другие столбцы с низким количеством элементов.Оптимизатор не будет использовать индекс.
  • UNIQUE индексы являются более дорогостоящими, чем неуникальные.Сколько их у вас.
  • Пакет 100, а не 2000 строк одновременно в одном операторе INSERT.
  • Включена ли репликация?
  • ТаблицаInnoDB?(У MyISAM много других проблем и есть несколько решений.)
  • Сколько у вас оперативной памяти?Какое значение имеет innodb_buffer_pool_size?
  • Что вы подразумеваете под «первой стадией»?
  • PARTITION по дате?Укажите фактическое определение раздела.Есть хорошие способы сделать это и бесполезные способы.
  • Сколько разделов?Более 50 имеет проблемы с производительностью.Скажите сколько, плюс укажите SHOW VARIABLES и SHOW GLOBAL STATUS; может стать обходным решением, если у вас их слишком много.
  • Будете ли вы очищать "старые" данные?Это причина разделения?Если нет, то разбиение может причинить больше вреда, чем помощи.
  • Не используйте RAM-диск;это отнимает у лучшего использования ОЗУ.
  • Сколько строк нужно вставить и как часто?То есть это ежечасная загрузка 2М строк?Или постоянная нагрузка 250 / сек?Или какой-то другой шаблон?
  • SSD накопители?
  • Это пахнет как хранилище данных.Есть много методов для такого.Основным является выгрузка данных из таблицы фактов в сводные таблицы.Вероятно, вы сможете избавиться от большинства из 50 индексов, как только вы это сделаете.Кроме того, создание «отчета» из сводной таблицы может быть в 10 раз быстрее, чем непосредственно из таблицы фактов.

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

DW: http://mysql.rjweb.org/doc.php/datawarehouse
Сводные таблицы: http://mysql.rjweb.org/doc.php/summarytables
High Speed ​​Ingestion (нацелено на 'непрерывный'): http://mysql.rjweb.org/doc.php/staging_table
Разделение: http://mysql.rjweb.org/doc.php/partitionmaint

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