首页 > 解决方案 > PDO 查询运行缓慢

问题描述

我已经查看并尝试了许多不同的解决方案,但似乎都没有奏效。我正在运行以下查询以从 100k 表中获取结果:

SELECT * FROM (SELECT expenses.id AS eID, expenses.date, 
                        expenses.receipt, expenses.purpose, expenses.date_submitted, 
                        expenses.expense_type, expenses.description, 
                        expenses.curr_used,expenses.reimbursement_amount, 
                        expenses.hst_amount, expenses.amex_amount, expenses.gl_acct, 
                        expenses.net_amount,expenses.status, users.id AS uID,  
                        users.firstname, users.lastname, users.department, 
                        users.adminship_level, users.is_finance 
                FROM expenses 
                    INNER JOIN users on expenses.user_id = users.id
            )  as expense_info 
WHERE (
        (department="Publishing" 
        AND adminship_level < 4) 
    OR uID=8
    ) 
ORDER BY date_submitted DESC 
LIMIT 15 

费用表是一个有 100k 行的表,而用户表有 500 个用户。

用户表通过 user_id 上的外键与费用相关联,并且还包含部门+管理级别的复合索引。

解释产生以下结果

使用 MySQL Workbench 运行此程序运行良好且速度非常快。然而,将完全相同的查询放入 php 并使用 PDO 的 prepare() + execute() 函数需要 6 整秒来获取 15 个结果。

关于如何提高速度的任何想法?我究竟做错了什么?

我正在使用 XAMPP,但没有 MariaDB(我使用的是 MySQL 8)

请询问可能有帮助的额外详细信息,我会提供

标签: phpmysql

解决方案


嗯,

SELECT e.id eID
     , e.date
     , e.receipt
     , e.purpose
     , e.date_submitted
     , e.expense_type
     , e.description
     , e.curr_used
     , e.reimbursement_amount
     , e.hst_amount
     , e.amex_amount
     , e.gl_acct
     , e.net_amount
     , e.status
     , u.id uID
     , u.firstname
     , u.lastname
     , u.department
     , u.adminship_level
     , u.is_finance 
  FROM expenses e
  JOIN users u
    ON e.user_id = u.id
 WHERE (u.department = "Publishing" AND u.adminship_level < 4) 
    OR uID=8
 ORDER 
    BY e.date_submitted DESC 
 LIMIT 15 

推荐阅读