Lan*_*ndo 5 php mysql performance
以下是更大的PHP脚本的一部分,该脚本使用CSV文件和客户端ID字段作为输入来添加或禁用MySQL数据库中的用户.
涉及两个表,users和users_clients.后者保留用户和客户端之间的关系,因为用户可以属于多个客户端.
这是表格的结构
用户结构(它有更多字段)
id | int(11) (primary key)
user | varchar(100)
pass | varchar(100)
category | int(11)
date | timestamp
name | varchar(100)
email | varchar(255)
Run Code Online (Sandbox Code Playgroud)
用户索引
SEARCH | user | FULLTEXT
SEARCH | name | FULLTEXT
SEARCH | email | FULLTEXT
Run Code Online (Sandbox Code Playgroud)
users_clients结构
id_user | int(11)
id_client | int(11)
status | enum('active','inactive')
Run Code Online (Sandbox Code Playgroud)
这是从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
Run Code Online (Sandbox Code Playgroud)如果它不存在,请将其添加到数据库中.
INSERT INTO
users ($fields,id_client)
VALUES
($values,'$id_operation')
Run Code Online (Sandbox Code Playgroud)获取插入用户的ID.我知道我可以在这里使用类似mysql_insert_id的东西,但竞争条件呢?
SELECT
u.id as id
FROM
users u
WHERE
u.user = '$user'
and u.id_client = '$id_operation'
Run Code Online (Sandbox Code Playgroud)将用户与相应的客户端相关联.
INSERT INTO
users_clients (id_user, id_client)
VALUES
('$id_user','$id_client')
Run Code Online (Sandbox Code Playgroud)表中目前有400,000个用户.该脚本需要10多分钟才能处理具有500个用户的CVS.
你会如何改进它以使它更快?
提前致谢.
PD:如果你想看到完整的功能,它可以在pastebin上找到.
INSERT INTO table (id,a,b,c) VALUES (5454,1,2,3)
ON DUPLICATE KEY
UPDATE table SET foo WHERE id=xyz;
Run Code Online (Sandbox Code Playgroud)
重要提示:对于上述语句,列id应具有唯一索引!!!