首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用复合主键更快地插入InnoDB表

使用复合主键更快地插入InnoDB表
EN

Database Administration用户
提问于 2022-08-01 20:40:20
回答 1查看 282关注 0票数 0

我有一个简单的tag_map

代码语言:javascript
复制
CREATE TABLE tag_map
(
article_id int(11) unsigned NOT NULL,
tag_id int(11) unsigned NOT NULL,
INDEX(tag_id),
PRIMARY KEY(article_id,tag_id)
) ENGINE=InnoDB

这个表相当大(超过9亿行)。显然,进入空表的INSERT相当快,但是当我添加更多行时,需要很长时间(因为它需要检查副本)。

代码语言:javascript
复制
INSERT IGNORE INTO tag_map (article_id,tag_id)
    SELECT article_id,tag_id FROM t1 WHERE article_id>0 AND tag_id>0

我没有并行运行基准测试,但是ARIA表添加更多行的速度大约要快2-3倍。

我想知道是否有让InnoDB变得更快的窍门?

有关人士如下:

代码语言:javascript
复制
innodb_buffer_pool_size = 50G
innodb_thread_concurrency = 0
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_flush_log_at_trx_commit = 0
EN

回答 1

Database Administration用户

发布于 2022-08-01 22:52:23

有两件事情可能会加快速度:

  • 在生成表后添加辅助键。也就是说,不要使用INDEX(tag_id),然后执行一个ALTER来添加索引。
  • 对输入的数据进行排序和去dup。这是插入..。选择不同的..。顺序为article_id,tag_id;

IGNORE需要进行查找,以验证该行是否已经存在。DISTINCT具有相同的效果,但是是批量执行的,而不是一次一行。

Aria表与InnoDB的相对大小是多少?

根据我的经验,“标签”不应该标准化。也就是说,我只需要(article_id, tag),而不是tag_id链接到另一个表。那额外的加入要花些钱。

另一个提示:如果你要对显示的文章进行排序,特别是限制和抵消,那么还有其他一些效率低下的地方。我在列表中讨论这个问题。(用“主题”代替“标签”)

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/315110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档