mysql - 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 都在所有表中添加了索引。
问题:
如何使这项工作更快?(我们使用共享的 Siteground 托管,但也许我们可以启用一些数据库缓存或其他一些模块,或者您有想法如何在这里优化请求的某些部分)
此 SQL 代码中的哪些请求部分最耗时?(我在这里看到的主要问题是日期间隔)。我们如何在某种调试模式下运行这个请求(例如在 PHPMyAdmin 或通过 PHP),以便我们可以看到请求的哪些部分消耗了多少时间?
也许有人可以提供此处提供的示例查询的固定版本,这样我就可以更好地理解这里出了什么问题?
解决方案
尝试在重复使用的列上添加索引。这将加快选择查询。
推荐阅读
- python - 不同批次中的 LSTM 相同句子在填充序列时预测不同的分数
- swift - .toolbar(...) 中的 SwiftUI NavigationLink 视图:模型更改时不需要的嵌套子视图
- javascript - 带有消息框确认的电子应用程序关闭对话框
- reactjs - 未捕获的错误:此 WebContents 禁用了 @electron/remote
- sass - 如何在 IDE 中弃用 CSS 选择器
- java - Spring data elasticsearch:抛出 MappingInstantiationException:无法使用带参数的构造函数 NO_CONSTRUCTOR 实例化 java.util.Set
- docker - 无法使用 docker 访问 Heroku 服务器上的 Web 应用程序
- tensorflow - 在 tensorflow-gpu 上运行时内存不足
- javascript - Angular – 将函数作为参数传递时失去对“this”的引用
- google-bigquery - 如何修复此 BigQuery 表架构的更新查询?