从另一张表中插入国家ISO或国家ID到MySQL

4
我想在我的数据库中插入每个访问者的国家。Maxmind返回2个字母的国家ISO码,我可以将其存储在VARCHAR(2)中,这将使用2个字节;或者,我可以使用UNSIGNED TINYINT,它将使用1个字节,并且是所有国家的表中的ID。
然而,我遇到了一个问题;我需要MyISAM引擎进行快速插入,但是MyISAM不支持外键,因此我猜想,对于每次插入,我都需要在国家表中进行选择以检索国家ID。
我不知道什么是最佳选择,我绝对需要使用MyISAM,因为会有大量插入,但我不想不断地进行选择以检索国家ID。
3个回答

1
如果您只需要2字母的ISO国家代码(而不是国家名称、语言或其他信息),那么我认为将其存储为CHAR(2)而不使用外部表比将其存储为SMALLINT(TINYINT无法涵盖所有国家)并查找额外表更少资源密集。注意:在这种情况下不需要VARCHAR(2),CHAR(2)更有效率。

关于CHAR存储类型的想法很好,我完全忘记了它,但是UNSIGNED TINYINT可以使用一个字节达到255,而且最多只有196个国家。 - user2593609

0
你可以从国家表中创建一个关联数组。将国家ID作为此数组的键。然后使其在视图中可用。因此,在视图中,您可以针对国家数组进行查找并显示相关国家。例如:
<?php echo $country[$customer['country_id']]['country_name']; ?>

这种方法不会每次构建一个 PHP 数组,该数组相当于在 MySQL 数据库中进行选择吗? - user2593609
哦,我从未使用过memcache,我会去看看它是如何工作的,谢谢你的建议! - user2593609

0

拥有外键(FK)支持和没有外键支持之间唯一的区别在于确保完整性。如果你使用一个支持外键的引擎,它不会允许您在没有该记录ID的情况下设置国家。

也就是说,国家数量是半静态的,我们只谈论几百个... 你可以将所有这些潜在的ID保存在内存中并可用。

或者你可以在插入期间执行选择操作,如下所示:

INSERT INTO sometable (col1,col2,country_id) VALUES('val1','val2', (SELECT id FROM countries WHERE iso_code = ?))

? 是 ISO 值。


我本来希望有一种方法可以避免在每次插入时执行选择操作,这样会大大减慢插入速度吗? - user2593609
如果您的表上有适当的索引,那么可能不会出现这种情况。我的意思是,出于性能原因,我个人可能甚至不会使用MyISAM。我使用它的唯一真正原因是全文搜索,但现在我使用像Solr这样的外部工具,所以这也不是问题。应用程序的性质究竟是什么? - prodigitalson
这是一个日志表,每秒钟有多个插入操作,因此选择MyISAM引擎以实现快速插入。在后台是一个统计部分。但不能进行编辑,这就是为什么我不需要InnoDB的行锁定。 - user2593609

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接