mysql:如何更快地插入具有多个索引的表?

时间:2018-11-19 11:31:52

标签: mysql indexing

我有一个带有约50个索引的分区表,我将插入约2000万个 每天记录。

每次我打电话给insert into tableA values (..),(..)...插入2000条记录时,大约需要五个小时。 我无法从文件加载数据。因此,我创建了一个与talbeB相同的表tableA,但是tableB没有索引。首先,我将数据插入tableB,然后调用insert into tableA select * from tableB where mydate = 20181119。第一阶段大约需要40分钟,第二阶段大约需要一个小时。

我想知道是否有更快的方法。非常感谢!

1 个答案:

答案 0 :(得分:1)

  • 不要自己创建索引标志或其他低基数列。优化器将不使用索引。
  • UNIQUE索引比非唯一索引的开销更大。你有几个。
  • 在单个INSERT语句中一次批处理100行,而不是2000行。
  • 是否涉及复制?
  • 表是InnoDB吗? (MyISAM还有很多其他问题,还有一些解决方案。)
  • 您有多少RAM? innodb_buffer_pool_size的值是什么?
  • “第一阶段”是什么意思?
  • PARTITION按日期?提供实际的分区定义。有好的方法可以做到,而无用的方法。
  • 多少个分区?超过50个存在性能问题。告诉我有多少,再提供SHOW VARIABLESSHOW GLOBAL STATUS;如果您有太多的话,可能会有 的解决方法。
  • 您将清除“旧”数据吗?这是分区的原因吗?如果不是这样,那么分区可能会带来更大的伤害。
  • 请勿使用RAM磁盘;这样就无法更好地利用RAM。
  • 要插入多少行?多久一次?也就是说,这是每小时200万行的负载吗?还是连续负载为250 /秒?还是其他模式?
  • SSD驱动器?
  • 这闻起来像数据仓库。有很多这样的技术。最主要的是将事实表中的内容卸载到摘要表中。一旦执行此操作,就可以摆脱50个索引中的个。此外,从“摘要”表构建“报告”的速度可能是从“事实”表直接生成“报告”的10倍。

请提供SHOW CREATE TABLE供进一步讨论。您可以混淆列名,但要与索引一致并具有实际的数据类型。

DW:http://mysql.rjweb.org/doc.php/datawarehouse
摘要表:http://mysql.rjweb.org/doc.php/summarytables
高速摄入(针对“连续”摄入):http://mysql.rjweb.org/doc.php/staging_table
分区:http://mysql.rjweb.org/doc.php/partitionmaint