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

标签 php mysql performance

以下是更大的 PHP 脚本的一部分,它使用 CSV 文件client id 字段作为输入从 MySQL 数据库添加或禁用用户。

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

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

    INSERT INTO 
        users ($fields,id_client)
    VALUES 
        ($values,'$id_operation')
    
  3. 获取插入用户的id。 我知道我可以在这里使用像 mysql_insert_id 这样的东西,但是竞争条件呢?

    SELECT
        u.id as id
    FROM
        users u
    WHERE
        u.user = '$user'
        and u.id_client = '$id_operation'
    
  4. 将用户与相应的客户端相关联。

    INSERT INTO
        users_clients (id_user, id_client) 
    VALUES
        ('$id_user','$id_client')
    

表中当前有 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;
  1. 在数据库中设置索引
  2. 使用mysqli代替mysql
  3. 收集所有你想插入的东西,然后用准备好的语句/存储过程来完成,就像这里How to insert an array into a single MySQL Prepared statement w/ PHP and PDO
  4. 不要执行 500 次 SELECT,只需获取整个数据库并通过 foreach/while 循环处理它,检查您需要的内容
  5. 使用上面的结构

重要:对于上面的语句,列 id 应该有一个唯一索引!!!

关于php - 如何提高此 PHP/MySQL 代码的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11020981/

相关文章:

php - 你能选择并加入一个mysql查询吗?

ruby - Sinatra 应用程序中的 gzip Assets

linux - Windows 与 Linux 上的 MarkLogic 性能比较

php - 获取引用外键的 ID 值

php - 如何将这 2 个查询合并为 1 个并避免额外的代码

PHP登录重定向流程

Python:以优雅的方式(代码保存)改进一个函数以避免多个语句

C# 与 PHP 脚本通信时无法创建 SSL/TLS 安全通道异常

mysql - 如何临时更改 MySQL 中的值

MySQL EXPLAIN 行数在简单的 WHERE 条件下要高得多