首页 > 解决方案 > MySQL 请求 - 在有 1000 条记录的数据库上运行非常缓慢

问题描述

我有很多连接的复杂 SQL 请求(它是由 PHP 为表生成的,应用了不同的过滤器来显示用户数据):

SELECT u.*,
       n.id AS network_id,
       n.name AS network_name,
       n.size AS network_size,
       count(distinct(un.userid)) AS network_elements_have,
       count(distinct(o.id)) AS total_orders,
       max(o.date) AS last_order_date,
       am.firstname AS am_firstname,
       am.surname AS am_surname,
       bdr.firstname AS bdr_firstname,
       bdr.surname AS bdr_surname,
       wc.status AS wc_status,
       wc.potential AS wc_potential,
       wc.calls AS wc_calls
FROM ei_users u
LEFT JOIN ei_orders o ON o.user_id=u.userid
LEFT JOIN ei_users am ON u.amid = am.userid
LEFT JOIN ei_users bdr ON u.bdrid = bdr.userid
LEFT JOIN ei_networks n ON u.network = n.id
LEFT JOIN ei_users un ON n.id=un.network
AND un.archive != '1'
LEFT JOIN ei_calls wc ON wc.userid = u.userid
AND wc.type = 'welcome'
WHERE u.archive != '1'
GROUP BY u.userid
HAVING last_order_date < NOW() - INTERVAL 15 DAY
ORDER BY u.userid DESC,
         o.date DESC

当我在具有 1755 个用户和 75000 个订单(ei_orders 表)的 MySQL 表(ei_users)上运行此请求时,它的运行速度非常慢(10 多分钟左右)。在请求字段中使用的所有 id 都在所有表中添加了索引。

问题:

  1. 如何使这项工作更快?(我们使用共享的 Siteground 托管,但也许我们可以启用一些数据库缓存或其他一些模块,或者您有想法如何在这里优化请求的某些部分)

  2. 此 SQL 代码中的哪些请求部分最耗时?(我在这里看到的主要问题是日期间隔)。我们如何在某种调试模式下运行这个请求(例如在 PHPMyAdmin 或通过 PHP),以便我们可以看到请求的哪些部分消耗了多少时间?

也许有人可以提供此处提供的示例查询的固定版本,这样我就可以更好地理解这里出了什么问题?

解释查询: sql解释

标签: mysqlsql

解决方案


尝试在重复使用的列上添加索引。这将加快选择查询。


推荐阅读