【发布时间】:2012-06-16 18:30:11
【问题描述】:
以下是更大的 PHP 脚本的一部分,它使用 CSV 文件 和 client id 字段作为输入从 MySQL 数据库添加或禁用用户。 p>
涉及两个表,users 和 users_clients。后者保持用户和客户端之间的关系,因为一个用户可以属于多个客户端。
这是表格的结构
users 结构(有更多字段)
id | int(11) (primary key)
user | varchar(100)
pass | varchar(100)
category | int(11)
date | timestamp
name | varchar(100)
email | varchar(255)
用户索引
SEARCH | user | FULLTEXT
SEARCH | name | FULLTEXT
SEARCH | email | FULLTEXT
users_clients 结构
id_user | int(11)
id_client | int(11)
status | enum('active','inactive')
这是从 CSV 文件添加每个用户的脚本的基本流程:
-
检查该客户端的用户是否存在。
SELECT LOWER(user) FROM users u INNER JOIN users_clients uc ON u.id = uc.id_user WHERE u.user = '$user' and uc.id_client = $id_client -
如果不存在,则将其添加到数据库中。
INSERT INTO users ($fields,id_client) VALUES ($values,'$id_operation') -
获取插入用户的 id。 我知道我可以在这里使用像 mysql_insert_id 这样的东西,但是竞争条件呢?
SELECT u.id as id FROM users u WHERE u.user = '$user' and u.id_client = '$id_operation' -
将用户与相应的客户端相关联。
INSERT INTO users_clients (id_user, id_client) VALUES ('$id_user','$id_client')
表中当前有 400.000 个用户。该脚本需要 10 多分钟来处理一个有 500 个用户的 CVS。
您将如何改进它以使其更快?
提前致谢。
PD:如果您想查看完整功能,请访问pastebin。
【问题讨论】:
-
您应该创建一个存储过程来完成所有工作。
-
你不应该有 mysql_insert_id 的竞争条件。只需给它您用于插入的连接即可。
-
顺便说一句,您还可以通过改进 mySQL 配置来加速这件事(谷歌搜索“mysql 入门”)。我不知道你的尺寸,但如果你每天这样做 10 小时,可能会有显着的性能提升
-
@ceejayoz:更新问题以包括表结构和索引。用户有一个 FULLTEXT 索引,其中包括用户、姓名和电子邮件字段。
标签: php mysql performance