Mysql 如何在innodb中禁用索引

Mysql 如何在innodb中禁用索引,mysql,indexing,innodb,Mysql,Indexing,Innodb,我试图通过临时禁用InnoDB表的索引来加速InnoDB表中的大容量插入: ALTER TABLE mytable DISABLE KEYS; 但它给出了一个警告: +-------+------+-------------------------------------------------------------+ | Level | Code | Message | +-------

我试图通过临时禁用InnoDB表的索引来加速InnoDB表中的大容量插入:

ALTER TABLE mytable DISABLE KEYS;
但它给出了一个警告:

+-------+------+-------------------------------------------------------------+
| Level | Code | Message                                                     |
+-------+------+-------------------------------------------------------------+
| Note  | 1031 | Table storage engine for 'mytable' doesn't have this option |
+-------+------+-------------------------------------------------------------+
1 row in set (0.00 sec)
我们如何禁用索引

在进行批量插入时,有哪些替代方法可以避免使用索引


我们如何加快流程?

您是否尝试过以下方法

    SET autocommit=0; 
    SET unique_checks=0; 
    SET foreign_key_checks=0;
从MySQL引用


请参阅“批量数据加载提示”

在InnoDB表上无法执行
禁用键有一个很好的理由;InnoDB不是为使用它而设计的,MyISAM就是

事实上,当您重新加载mysqldump时会发生以下情况:

您将看到MyISAM表的
CREATE TABLE
,后面是写锁

在运行所有大容量插入之前,调用
altertable。。。禁用钥匙
已完成

这样做的目的是关闭MyISAM表中的二级索引

然后,完成批量插入。执行此操作时,将重建MyISAM表中的主键和所有唯一键。在
解锁表格
之前,调用
更改表格。。。启用键
是为了线性重建所有非唯一索引

IMHO此操作未编码到InnoDB存储引擎中,因为非唯一索引中的所有键都带有来自的主键项(也称为聚集索引)。这将是一个非常昂贵的操作,因为构建非唯一索引需要O(n logn)运行时间来检索要附加到非唯一密钥的每个唯一密钥


有鉴于此,,对于涉及非MyISAM存储引擎的任何特殊情况,在InnoDB表上发布关于尝试禁用键/启用键的警告要比在mysqldump中编写异常代码容易得多。

为了降低重新计算索引的成本,您应该使用数据填充或Mysql多行插入插入数据,像

在tbl_名称中插入(a、b、c)值(1,2,3)、(4,5,6)、(7,8,9)

->因此,用一条语句插入几行



一条语句可以插入多少行取决于mysql设置。

有点晚,但。。。无论什么忘记这里的所有答案,不要禁用索引,没有办法,只需将它们放在ALTER TABLE tablename drop INDEX
WHERCH
,大容量插入数据,然后ALTER TABLE tablename ADD INDEX
WHERCH
WHERCH
);重新创建索引的时间占带索引的大容量插入的1%,例如400000行带索引需要10分钟,没有索引需要2秒…,干杯…

您有多少数据(以行和千兆字节为单位)?如何加载它?大约500万行,大约1.2GB。谢谢。相关人员:你要重新加载整个桌子吗?如果没有,占桌子的百分比是多少?我试过这么做。但问题是,如何知道索引是启用还是禁用的?我知道“EXPLAIN”语句有助于理解“SELECT”语句,但“LOAD DATA LOCAL infle”呢“声明?运行此命令时,如何知道是否启用了索引?谢谢。@fanchyna,禁用/启用密钥是一个全局设置,而不是每个会话。用于查看索引是否被禁用或启用。关闭这些索引可能会在以后引起问题。感谢您的解释,但问题仍然存在:上传数据时如何避免使用索引以减少导入时间。谢谢。@rolandmysqldba的意思是,禁用INNODB数据库上的索引不会明显减少加载时间。聚集索引本身就是基于树的(=对数计时)数据结构;您可以选择在nlogn处构建整个索引,或者运行n个logn插入。您可能会在每次插入成本上节省一点,但在实践中,我打赌这是非常少的;已经有了顺序插入优化。我定期构建非常大的
innodb
表,其中包含大量索引(数百GB/10+不同的索引)。当I
INSERT
插入到没有索引的表中时,创建时间大大缩短。显然,“巨大”在很大程度上取决于表的最终大小、索引的数量和类型、数据元素的类型等。我通常只使用主键构建表(如果只是加载已经有主键id的数据,则不需要),然后在最后构建索引。您可能不会注意到5MM行和1.5GB的差异,但随着表的增长,您会注意到。只删除所有辅助索引,而不是主键。然后以完美的PK顺序插入新数据。在可行的情况下,对每个分区使用单独的(并行)插入。然后将所有索引添加回一个ALTERTABLE语句中,该语句包括短语ALGORITHM=INPLACE,以避免重写数据。您确定这一点吗?那么,你是在告诉我们用一条insert语句插入一百万行吗?我不是告诉你用一条语句插入“所有数据”,而是一次插入几行。在我的应用程序中,每次插入都使用了500-1000行,没有问题。这主要取决于行数和每行插入的数据量。那么什么是好的数字呢?你是通过试错来决定的吗?见我之前的评论。我在一份声明中没有明确表示要做什么。如果您的服务器有无限量的内存,您可以使用无限大/长/大statements@Drew我就是这么说的。无论如何,我都会更新答案,因为你发布的链接是有用的。很好!谁曾降级过这个帖子。我想知道为什么。插入后重新创建索引需要多长时间?我假设索引存在是有原因的,所以删除它们、插入记录,然后创建回相同的索引,都需要时间。考虑到删除和创建索引所需的时间,它是否更快?创建索引时,速度惊人。它可能在将索引写入数据库之前对内存中的索引进行排序