我无法找到一种使用 php/mysql 在数据库中注册大量数据的有效方法。
我有一个电话号码列表,它存储在号码表
中。
PHONE_ID | PHONE_NUMBER | COUNTRY_ID
varchar
还有一个将电话号码与“联系人列表组”链接起来的表格。我们假设它的名称是 link_phonegroup
。
对于每个电话/组链接,我都有一个参数列表。
GROUP_ID | PHONE_ID | PARAMETERS_LIST
varchar
我的脚本应该能够在给定 group_id 的情况下计算数百万个数字,并且:
- 检索与号码关联的 number_id 或插入号码(如果不存在)(并返回 insert_id)
- 更新与该组/号码对关联的parameters_list,如果该对不存在,则将其插入
目前,我循环 (foreach
) 我的数字,并且 foreach 数字:
从号码中选择 PHONE_ID,其中 PHONE_NUMBER = '$number'
- 如果它不存在,我
INSERT INTO ...
并使用mysql_insert_id()
检索这个新创建的id - 然后,利用此 ID,我
从 link_phonegroup WHERE GROUPE_ID = $group_id AND PHONE_ID = $phone_id 中选择 PARAMETERS_LIST
。 - 如果确实存在,我就会
更新
我的参数列表,如果不存在,我就会INSERT
在我的link_phonegroup
中添加一个新行表。
正如您想象的那样,我的问题是,对于我的 X 百万个数字中的每一个,我将触发 4 个查询。这是缓慢、低效且可怕的。
我了解了 INSERT INTO ON DUPLICATE KEY
技术 ( MySQL manual page )。我的测试非常慢,我放弃了。
我了解了 UPDATE CASE WHEN
技术 ( Example )。
insert/update/retrieveid/insert_into_this_other_table/make_me_a_sandwich/and_dont_forget_coffee
,用几句话来完成所有工作
,这 - 我希望! - 对于数据库来说将是一种更快且压力更小的方法。
这是好方法吗?这是最好的方法吗? 如果是的话,这个死亡机甲的骨架会是什么?我不知道如何在插入或更新参数列表的同一请求中插入或检索电话 ID,因为在数百个其他类似请求的同一请求中给出了此电话 ID? 这可能吗?
我希望你理解我的神经已经放弃了很长一段时间。 我将很高兴并感谢您能给我的任何帮助。
谢谢。
最佳答案
您想要的可以通过存储过程来完成。我将首先向您介绍一些资源——因为您似乎已经对 MySQL 有所了解,因此学习存储过程如何工作并自己编写代码可能对您有好处,而不是让其他人直接向您提供存储过程。
http://code.tutsplus.com/articles/an-introduction-to-stored-procedures-in-mysql-5--net-17843
http://www.mysqltutorial.org/mysql-stored-procedure-tutorial.aspx
关于PHP循环和MySQL逻辑: how to?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28539367/