如何在MySQL/PHP中为数百万条记录分配预定义值

如何在MySQL/PHP中为数百万条记录分配预定义值,php,database,Php,Database,这是我关注的问题: 我有一个mysql表(main_table),它有不同的列(id,reg_date,time等)。它大约有3000万行,而且还在增长 最近我发现我需要为表分配一个包含1550个不同名称的额外列表/表(例如,“Michael Flowers”,“Dora Dorn”,等等) 哪个名称将被分配到哪个行并不重要,因此我可以使用一个随机id函数。但是从主表行查询时,名称应始终相同 最简单的解决方案是更改主表,然后为每行插入一个从1到1550(例如10)的随机值。但是,我不太愿意这样做

这是我关注的问题:

我有一个mysql表(
main_table
),它有不同的列(
id
reg_date
time
等)。它大约有3000万行,而且还在增长

最近我发现我需要为表分配一个包含1550个不同名称的额外列表/表(例如,
“Michael Flowers”
“Dora Dorn”
,等等)

哪个名称将被分配到哪个行并不重要,因此我可以使用一个随机id函数。但是从
主表
行查询时,名称应始终相同

最简单的解决方案是更改
主表
,然后为每行插入一个从1到1550(例如10)的随机值。但是,我不太愿意这样做,因为我认为这会导致性能问题。另一个原因是行数在不断增长,因此我可能需要添加一些批处理

唯一的限制是,一旦为特定行分配了名称,它应始终返回相同的名称。例如,如果我将
“Michael Flowers”
(id介于1到1550之间,例如10)分配给主表中的一行(例如30000),则在检查行30000时,我需要能够始终检索相同的名称

因此,我在想是否有可能创建一个函数/算法,使
main_表中的每一行映射到1550个可用名称中的一个名称,如

echo name_of_row(30000);  
// result would be 10, I may then query and my list and find it's Michael Flowers

假设您的新名称表具有从1->1500的连续ID号,那么您只需向主表添加一个新的整数字段,然后执行以下操作

UPDATE main_table SET linkfield = FLOOR(1 + (rand() * 1550))
MySQL的rand函数不是水晶般的,但在这种情况下,它肯定会做得足够好

然后通过一个简单的连接获得主_表的随机名称值:

SELECT main_table.*, name_table.name
FROM main_table
LEFT JOIN name_table.id = main_table.linkfield

有什么问题吗?还有tl;dr.我不确定我是否理解这一点,但你不能用一个辅助表来解决这个问题,该表存储这些“附加”1550名称,然后用外键在主表中引用它们吗?如果我明白这一点,我不确定我是否做到了……所有的问题都解决了,除了问题。不过,我想应该是“我怎样才能得到我所描述的?”谢谢你的回答。然而,你可能会发现更新数百万条记录需要一些时间,所以我认为这不是一个可靠的解决方案。@Michael:但你只会做一次。我真的看不出问题出在哪里。@Michael:这将比任何其他黑客破解的解决方案都可靠得多。