我的网站每晚进行一次API数据获取,每晚插入100,000多个新条目。为了节省空间,每个字段名称都在一个单独的表中,分配的ID每个数据集大约节省1,027个字节,大约每晚2.5675MB,一年内不到一千兆字节,但是这会增加。
对于每个用户,请求包含要添加的112个条目的JSON文件。我觉得为了节省时间,而不是检查我的表中的每个名称ID,最好创建一个数组,而数组中的位置将是ID,所以让我们使用一些随机的蔬菜名称;
蔬菜随机清单
"Broccoli", "Brussels sprouts", "Cabbage", "Calabrese", "Carrots", "Cauliflower", "Celery", "Chard", "Collard greens", "Corn salad", "Endive", "Fiddleheads (young coiled fern leaves)", "Frisee", "Fennel"
当我通过PHP类创建插入时,我使用以下内容;
$database->bind(':veg_name', VALUE);
快速检查数组中$x
位置的最佳方法是什么?
答案 0 :(得分:1)
如果你只做2.5公里/晚,那几乎没有。如果你在拖动之前对它进行了解压缩,那么它会减少更多。
如果您尝试使用数组位置匹配某些其他表格中的内容,则使用数组位置可能会非常棘手。
话虽如此,每个数组都有一个数字索引,所以你可以在任何时候找出它是什么。
试试这个,你会看到:
$array = array("Broccoli", "Brussels sprouts", "Cabbage", "Calabrese", "Carrots", "Cauliflower", "Celery", "Chard", "Collard greens", "Corn salad", "Endive", "Fiddleheads (young coiled fern leaves)", "Frisee", "Fennel");
var_dump(array_keys($array));
在阵列上,你也可以这样做:
$currentKey = array_search("carrot",$array);
这将返回给定变量的键。因此,如果您在数组中循环,则可以输出密钥(索引)并使用它执行其他操作。
此外,gzip是一种压缩形式,可以使您的数据更小。
答案 1 :(得分:1)
作为匹配PHP中条目的替代解决方案(可能在某些时候遇到时间和/或内存问题):
一般的想法是让数据库工作。它已经过优化(索引结构)以匹配条目。
因此,根据您的示例,数据库可能具有字段名称fields
的维度表:
ID | Name
---------------------------------
0 | "Broccoli"
1 | "Brussels sprouts"
2 | "Cabbage"
然后是" final"表facts
,其结构如下:
User_ID | Field_ID | Timestamp
现在应该插入一批新条目。为此,我们首先使用以下格式创建临时表temp
并插入所有原始条目。最后一列Field_ID
暂时保持为空。
User_ID | Field_Name | Timestamp | Field_ID
在下一步中,我们使用简单的SQL查询匹配每个字段名称及其ID:
UPDATE `temp` t
SET Field_ID=(SELECT Field_ID FROM fields f WHERE f.Name=t.Field_Name)
现在数据库已经完成了我们所需的映射,我们可以发出另一个查询来将行插入到事实表中:
INSERT INTO facts
SELECT User_ID, Field_ID, Timestamp FROM temp WHERE Field_ID IS NOT NULL
这里有一个小副作用:temp
表中无法匹配的所有行(我们的fields
表中没有字段名称)仍然可用那里。因此,我们可以编写一些逻辑来在某处发送错误报告,并让某人添加字段名称或以其他方式解决问题。
完成后,我们应该删除或至少截断temp
表,为下一夜的迭代做好准备。
小评:这里的查询仅仅是示例。您可以在一个查询中执行映射并插入到facts
表中,但是您将失去"无法匹配的"条目或必须重做工作。
现在重做工作可能不是问题,但是你说未来的参赛作品数量会增加,所以这可能会成为一个问题。
答案 2 :(得分:0)
如果您有一个项目列表,例如一个只包含代表您的值的字符串的数组,您可以使用foreach
使用键值($users as $index => $user
)方法,而不仅仅使用$users as $user
,如下所示:
$users = ["Broccoli", "Brussels sprouts", "Cabbage", "Calabrese", "Carrots", "Cauliflower", "Celery", "Chard", "Collard greens", "Corn salad", "Endive", "Fiddleheads (young coiled fern leaves)", "Frisee", "Fennel"];
foreach( $users as $index => $name ) {
echo "about to insert $name which is the #$index..." . PHP_EOL;
}
将回应:
即将插入#0 ...
的西兰花即将插入#1 ...
的布鲁塞尔豆芽即将插入甘蓝,即#2 ...
即将插入#3的Calabrese
即将插入#4 ...
的胡萝卜即将插入花椰菜,这是#5 ...
即将插入Celery,即#6 ...
即将插入Chard,即#7 ...
即将插入#8 ...
的Collard果岭即将插入玉米沙拉,这是#9 ...
即将插入Endive,即#10 ...
即将插入#11 ...
的Fiddleheads(年轻的卷曲蕨叶)即将插入Frisee,即#12 ......
即将插入#13 ...
的Fennel
此处提供实时示例:https://repl.it/Jpwk
就像@ m13r问的那样,索引如何在你的情况下有用?