我不是很熟悉PHP,但是你不能将国家列表存储在数据库中(在你的用户表中有一个FK到这个列表中),将列表存储在缓存中,并在发生变化时更新缓存?看起来世界上的所有不稳定,你希望能够经常更新这个列表,并且像这样硬编码将要求你每次内战时都要改变你的代码。
在我看来,将表中国家/地区的名称与用户名放在一起将节省内存性能,因为您不会将国家/地区的名称存储在数组中。但是,除非没有获取国家/地区名称的查询,否则您将使用原始方式进行相同数量的查询,因此您不会节省太多其他内容。
要提高速度,请使用MEMORY创建表格 的 存储引擎 强> ,一旦数据库开始用你的值填充表,它就会非常快。
此外,访问您的阵列非常快,因为您是 的 不搜索数组 强> ,你知道位置(用int键),只是寻找那里。
编辑:在第二遍,考虑我下面所说的关于字符串的所有内容,但选择一个 枚举 领域。在包含所有国家/地区的数据库中创建枚举,并使用该枚举而不是字符串或其他表。它应该为您提供使用字符串的所有好处(比如在没有连接的情况下获取您想要的值)以及使用第二个表的所有好处。
假设您的主要用例是“让我所有用户和国家/地区”或“让我使用用户N和国家/地区”,那么 最快的 你可以做的是存储字符串。
这有一些陷阱:字符串比较比索引方法(在另一个答案中讨论)更昂贵,并且如果你计划经常运行一些东西,以“让我所有用户来自X国”,你很清楚那里的指数你可以避免字符串比较。
即使后一种情况存在,如果后一种情况占据主导地位,数据将会发生变化(您计划在以后添加新国家,更新国家名称),如果您想要根据某些用户区域设置等更改要更改的国家/地区名称的语言
避免连接将节省一些执行时间,但是第二个表 可以 也适合你。
保持一个叫做的表会最快 countries 和你的一个领域 users 表叫 country 要么 country_id 保存每个用户所在国家/地区的外键 countries 表。
countries
users
country
country_id
MYSQL中的连接通常(几乎总是)比遍历返回记录列表并将国家与用户配对更快。
对于数据的初始加载,您可以使用ISO-3166数据。大多数Linux发行版附带一个包(iso-codes),其中包含所有国家及其名称的列表 翻译成多种语言 。也有多种格式(CSV,XML和.po用于翻译)。
http://pkg-isocodes.alioth.debian.org/
键应该是整数,而不是字符串,除了它没关系。
通常,比较整数值比比较字符串更有效。