mysql索引键太多

mysql索引键太多,mysql,database,Mysql,Database,我正在进行数据库优化,每隔15分钟从.csv文件(大约3800条记录)中批量插入一次 为此,我通过cron运行一个mis.sql文件。此文件包含九(09)个mysql查询,这些查询从以批量插入为目标的表中执行重复删除、内部连接插入、删除和更新(ALTER、DELETE、insert和UPDATE) 最近,在大容量插入查询之前运行的查询遇到了一个问题。问题是- 更改忽略表pb添加唯一索引(hn,时间) 错误1069(42000):指定的键太多;最多允许64个密钥 遇到上述错误时,将跳过所有后续查询

我正在进行数据库优化,每隔15分钟从.csv文件(大约3800条记录)中批量插入一次

为此,我通过cron运行一个mis.sql文件。此文件包含九(09)个mysql查询,这些查询从以批量插入为目标的表中执行重复删除、内部连接插入、删除和更新(ALTER、DELETE、insert和UPDATE)

最近,在大容量插入查询之前运行的查询遇到了一个问题。问题是-

更改忽略表
pb
添加唯一索引(hn,时间)

错误1069(42000):指定的键太多;最多允许64个密钥

遇到上述错误时,将跳过所有后续查询。然后我检查了table
pb
,发现有64个唯一的索引键是用相同的基数值创建的,还有02个索引键和01个主键

虽然尝试删除其中一个唯一索引需要花费太多的时间(979618条记录大约需要15分钟),但最终没有被删除


这个问题有什么解决办法吗?

第一件事:为什么会有ALTER TABLE命令?新数据应更改数据,而不是数据库设计。所以,尽管插入、更新和删除是这样一个脚本中的有效选项,但ALTER表不属于这里。移除它

至于删除索引:这应该只需要几分之一秒。没有什么可以建造或重建的,只是简单地移除

DROP INDEX index_name ON tbl_name;

我能想到的唯一原因是,在没有插入、更新和删除的情况下,甚至没有很短的时间段。因此,您可能需要停止作业一段时间(或在空文件上运行),删除所有不必要的索引(只保留一个),然后重新开始作业。

谢谢Thorsten Kettner。。!即使在执行查询(即在tbl_name上删除INDEX_name)之后,也会花费大量时间(大约10-15分钟)并最终抛出错误。索引仍然存在,无法删除。用于删除重复项的ALTER TABLE用法是从唯一索引引用的。该索引不删除重复项。它不允许删除重复项!因此,只需定义一次表和索引,就可以了。你不会一次又一次地这么做。从定义索引的那一刻起,就不能有重复项。您可以使用
INSERT ON DUPLICATE KEY UPDATE
INSERT IGNORE
来处理冲突。至于删除索引,我认为没有理由不立即生效。这里有一种可以尝试的替代语法,但我认为它没有任何区别:
altertable TABLE\u name DROP INDEX\u name
。确保在删除索引时表上没有任何操作。操作完成了…我删除了所有唯一索引,只设置了一个唯一索引…每次cron运行.sql文件时,它还将执行-ALTER table
pb
DROP index hn_tm_indx,添加唯一索引hn_tm_indx(hn,tm);我还是不知道你为什么要删除并创建那个索引。您有一个带有索引的表。索引避免了重复。然后删除索引。为什么?您这样做只是为了允许重复!也许您希望导入允许重复的数据,然后在重新创建索引之前删除重复的数据?否则,降低该指数将毫无意义。因此,最有可能的情况是,您最好从脚本中删除DROP INDEX和CREATE INDEX语句。您是对的……删除和添加唯一索引没有任何意义……唯一索引已经创建。所以,最后从脚本中删除了这些语句。。。谢谢Thorsten Kettner。。。!