2016-01-24 2 views
2

Когда вы делаете сотни тысяч запросов на сервере БД, переход отВСТАВИТЬ .... дублирование и автоинкрементного выпуск

SELECT foo FROM bar WHERE rec_id=xyz 
if (!record_found){ 
    INSERT INTO bar (x,y,z) VALUES (1,2,3) 
} 

к:

INSERT INTO bar (x,y,z) VALUES (1,2,3) ON DUPLICATE KEY UDPATE count=count+1 

имеет ОГРОМНЫЙ повышение производительности. Загрузка процессора на сервер резко падает. Однако, если у вас есть поля в таблице, которые настроены на автоматическое увеличение, вы теряете прилегание, и они увеличиваются с очень высокой скоростью.

Меня не интересует соприкосновение поля автоматического приращения, но меня немного беспокоит экспоненциальная скорость, с которой поле автоматического увеличения увеличивается на мгновение, так как я встречаю тонну дубликатов записей. Мы говорим о значении автоинкремента, достигающем значения 10 миллионов +, когда фактическое количество записей в базе данных близко к 0,5 миллионам (в течение недели).

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

+0

Аналогичный, но не точный вопрос здесь: http://stackoverflow.com/questions/5924762/prevent-autoincrement-on-mysql-duplicate-insert – Dave

+0

Включает ли INSERT IGNORE значение поля автоматического увеличения, в случае вставить сбой? (для двигателя хранения innodb) Может ли кто-нибудь ответить на это, если вы знаете окончательно? Я мог бы обойтись с этим. – hvs

+0

, вероятно, это займет 2 минуты, чтобы проверить его. Ты действительно мне нужен? Я буду – Drew

ответ

1

Просто включите rec_id (что вы, кажется, знаете, и это, кажется, ключ, вероятно, основная) во вставку:

INSERT INTO bar (rec_id, x,y,z) 
VALUES (xyz, 1,2,3) 
ON DUPLICATE KEY count=count+1 
+0

Вы правы в том, что rec_id является первичным ключом. Тем не менее, я не знаю значения значения rec_id, когда я вставляю запись. Является ли запись дублирующей или нет, определяется на основе другого составного ключа, который также является уникальным. Поле rec_id существует для связи с другими таблицами. – hvs

+0

Мне показалось, что 'rec_id' известен, потому что ваш« оригинальный »код (который, как вы сказали, вы заменили на« insert ... on duplicate key »), использует его. Что касается пробелов, InnoDB с настройками по умолчанию их генерирует (это связано с параллельными вставками). InnoDB с 'innodb_autoinc_lock_mode = 0' не создает пробелов, но этот режим имеет серьезные ограничения масштабируемости (в основном это глобальная блокировка). – weirdan

1

Чтобы ответить на этот вопрос в комментариях под вопросом:

Это приводит к увеличению AUTO_INCREMENT после отказа (так сказать) от игнорирования вставки.

create table xyz 
( id int auto_increment primary key, 
    thing varchar(20) not null, 
    unique key(thing) 
); 

insert xyz(thing) values ('frog'); 
insert ignore xyz(thing) values ('frog'); 
insert xyz(thing) values ('lizard'); 

select * from xyz; 
+----+--------+ 
| id | thing | 
+----+--------+ 
| 1 | frog | 
| 3 | lizard | 
+----+--------+ 

Весь индекс Зазор аномалия является хорошо известная «фича» InnoDB. Большинство из нас принимают это и просто двигаются дальше.

+0

, который сказал, пусть один из парней ниже решит его для вас. Не означает дождь на их параде: P – Drew

+0

Спасибо за тестирование. Я также подтвердил это в конце. Как я уже сказал, пробелы в индексе не являются проблемой для меня, но скорость изменения поля индекса вызывает беспокойство. Должен ли я быть обеспокоен или нет, то, что я прошу таких экспертов, как вы. – hvs

+0

Отметьте этот мой ответ: http://stackoverflow.com/a/33666394 Существует преднамеренная причина, по которой я пошел с MyISAM. Это было из-за пробелов, и я хотел (на полпути) показать подсчеты (ну, мин, макс, считать вместе, не запутывая всех).И поскольку MyISAM против INNODB может поднять такую ​​вонь с разными аудиториями, мне пришлось отказаться от использования MyISAM. – Drew

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