2015-07-13 53 views
-1

我在数据库优化中工作,其中每隔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分钟),但最后它并未被删除。

有没有解决这个问题的方法?

回答

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); –