如何提高此PHP/MySQL代码的性能?

Lan*_*ndo 5 php mysql performance

以下是更大的PHP脚本的一部分,该脚本使用CSV文件客户端ID字段作为输入来添加或禁用MySQL数据库中的用户.

涉及两个表,usersusers_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文件添加每个用户的脚本的基本流程:

  1. 检查该客户端是否存在该用户.

    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)
  2. 如果它不存在,请将其添加到数据库中.

    INSERT INTO 
        users ($fields,id_client)
    VALUES 
        ($values,'$id_operation')
    
    Run Code Online (Sandbox Code Playgroud)
  3. 获取插入用户的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)
  4. 将用户与相应的客户端相关联.

    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上找到.

Sli*_*liq 6

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)
  1. 在DB中设置索引
  2. 使用mysqli而不是mysql
  3. 收集你想要插入的所有东西并用这里准备好的语句/存储过程来完成它如何将数组插入到带有PHP和PDO的单个MySQL Prepared语句中
  4. 不要做500个SELECT,简单地获取整个数据库并通过foreach/while循环完成它,检查你需要的东西
  5. 使用上面的结构

重要提示:对于上述语句,列id应具有唯一索引!!!