2015-07-13 4 views
-1

Я работаю над оптимизацией базы данных, где есть объемная вставка из CSV-файла (около 3800 записей) с интервалом каждые 15 минут.mysql too many indexe keys

Для этого я запускаю файл mis.sql через cron. Этот файл содержит Nine (09) mysql-запросы, которые выполняют удаление дубликатов из таблицы, в которой размещена массовая вставка, Inner join Inerts, Deletes and Updates (ALTER, DELETE, INSERT & UPDATE).

В последнее время возникает проблема с запросом, который выполняется непосредственно перед запросом массовой вставки. Запросов:

ALTER IGNORE TABLE pb ADD UNIQUE INDEX (hn, time);

ОШИБКА 1069 (42000): Слишком много указанных ключей; max 64 ключа разрешено

При возникновении ошибки выше все последующие запросы пропускаются. Затем я проверил таблицу pb и обнаружил, что существует 64 уникальных индексных ключа, созданных с одинаковым значением, наряду с 02 индексными ключами и 01 основным ключом.

При попытке удалить один из уникальных индексов он занимает слишком много времени (почти 15 минут для 979 618 записей), но в конце он не удаляется.

Есть ли какие-либо решения этой проблемы?

ответ

0

Первое: почему есть команда ALTER TABLE? Новые данные должны изменить данные, а не дизайн базы данных. Таким образом, хотя INSERT, UPDATE и DELETE являются допустимыми параметрами в таком скрипте, ALTER TABLE там не принадлежит. Убери это.

Что касается удаления индекса: это займет всего одну секунду. Нечего строить или перестраивать, просто удалить.

DROP INDEX index_name ON tbl_name; 

Единственная причина для этого так долго я могу думать о том, что не существует даже короткий временной отрезок, когда нет вставки, обновления и удаления происходят. Так что, возможно, вам нужно будет временно приостановить работу (или запустить ее в пустом файле), сбросить все ненужные индексы (только сохранить их) и снова начать работу.

+0

спасибо Thorsten Kettner ..! Даже после выполнения запроса, т. Е. DROP INDEX index_name ON tbl_name, он занимает огромное время (около 10-15 минут) и, наконец, выдает ошибку. Указатель остается, его нельзя удалить. Использование ALTER TABLE для удаления дубликатов, относится к http://stackoverflow.com/a/14050607/3872641 –

+0

Уникальный индекс не * удаляет * дубликаты. Он не позволяет * разрешать * их! Таким образом, вы определяете таблицу и индекс * один раз *, и все. Вы не делаете этого снова и снова. С момента, когда вы определили индекс, не может быть дубликатов. Вы должны использовать 'INSERT ON DUPLICATE KEY UPDATE' или' INSERT IGNORE' для обработки конфликтов. Что касается снижения индекса, я не вижу причин, по которым это не работает немедленно. Вот альтернативный синтаксис, который вы можете попробовать, но я не думаю, что это имеет значение: 'ALTER TABLE table_name DROP INDEX index_name'. Убедитесь, что при снижении индекса нет действий в таблице. –

+0

Это сделано .... Я удалил все уникальные индексы и установил только один уникальный индекс ... каждый раз, когда cron запускает .sql-файл, он также будет выполнять - ALTER TABLE 'pb' DROP INDEX hn_tm_indx, ADD UNIQUE INDEX hn_tm_indx (hn, tm); –