Во-первых: ваш первичный ключ bigint может убить вас здесь, это очень дорогой тип для поддержки. 1,5 миллиона записей нигде не приближаются к пределу для unsigned int (~ 4,2 миллиарда).
Использование большого int для первичного ключа еще хуже в InnoDB, поскольку он хранит PK для каждой записи в каждом другом индексе, что может частично объяснить проблемы при попытке переключения. Как только вы добавляете и удаляете данные из таблицы, MyISAM облажается при большом количестве одновременных транзакций.
Хитрость, позволяющая обойтись за счет сравнения строк, заключается в том, чтобы хранить crc32 (shingle), а также shingle. Затем вы индексируете этот столбец, но не свой varchar. Пример того, как я могу это сделать ниже:
CREATE TABLE IF NOT EXISTS `shingles` (
`id` int unsigned NOT NULL auto_increment,
`TS` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
`crc` int unsigned not null,
`shingle` varchar(255) NOT NULL,
`count` int(11) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `crc` (`crc`)
)
insert into shingles (crc, shingle, count) values (crc32('testtest'),'testtest',1),(crc32('foobar'),'foobar',4);
select * from shingles where crc = crc32('foobar') and shingle = 'foobar';
Если вы намереваетесь запросить 'ts', добавьте его как второй компонент индекса crc