我在数据库优化中工作,其中每隔15分钟有一个来自.csv文件的大容量插入(大约3800条记录)。mysql太多索引键
为此,我通过cron运行mis.sql文件。此文件包含执行重复删除的九(09)个mysql查询,其中批量插入的目标为Inner join,Insert join,Deletes and Updates(ALTER,DELETE,INSERT & UPDATE)。
最近,在大容量插入查询之前运行的查询遇到了一个问题。查询是 -
ALTER IGNORE TABLE pb
ADD UNIQUE INDEX(hn,time);
错误1069(42000):指定的键过多;允许最多64个密钥
在遇到上述错误时,所有后续查询都将被跳过。然后我检查了表pb
,发现有64个唯一索引键与02索引键和01主键一起创建了相同的基数值。
在尝试删除某个Unique Indexes时,它花费的时间太长(对于979,618条记录,花了将近15分钟),但最后它并未被删除。
有没有解决这个问题的方法?
感谢Thorsten Kettner ..! 即使在执行查询DROP INDEX index_name ON tbl_name之后,它需要很长的时间(大约10-15分钟),最后抛出一个错误。索引依然存在,无法删除。 重复删除的ALTER TABLE用法,引用自 http://stackoverflow.com/a/14050607/3872641 –
唯一索引不会*删除*重复项。它不允许*它们!所以你一次定义表和索引*就是这样。你不会一次又一次地做到这一点。从你定义索引的那一刻起,就不会有重复。你可以使用INSERT ON DUPLICATE KEY UPDATE或INSERT IGNORE来处理冲突。至于放弃指数,我认为没有理由不立即工作。这里有一个可以尝试的替代语法,但我认为它没有任何区别:'ALTER TABLE table_name DROP INDEX index_name'。删除索引时,确保表上没有任何操作。 –
完成了....我删除了所有唯一索引并设置了唯一索引...每当cron运行.sql文件时,它也将执行 - ALTER TABLE'pb' DROP INDEX hn_tm_indx,ADD UNIQUE INDEX hn_tm_indx(hn,tm); –