我有一个简单的tag_map
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相当快,但是当我添加更多行时,需要很长时间(因为它需要检查副本)。
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变得更快的窍门?
有关人士如下:
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发布于 2022-08-01 22:52:23
有两件事情可能会加快速度:
INDEX(tag_id),然后执行一个ALTER来添加索引。IGNORE需要进行查找,以验证该行是否已经存在。DISTINCT具有相同的效果,但是是批量执行的,而不是一次一行。
Aria表与InnoDB的相对大小是多少?
根据我的经验,“标签”不应该标准化。也就是说,我只需要(article_id, tag),而不是tag_id链接到另一个表。那额外的加入要花些钱。
另一个提示:如果你要对显示的文章进行排序,特别是限制和抵消,那么还有其他一些效率低下的地方。我在列表中讨论这个问题。(用“主题”代替“标签”)
https://dba.stackexchange.com/questions/315110
复制相似问题