mysql - 组连接查询性能
问题描述
我有一个查询几乎需要 22 秒来填充数据。
SELECT
TP.*,
GROUP_CONCAT(DISTINCT TS.`subject_name`) AS subjects,
GROUP_CONCAT(DISTINCT TC.`class_name`) AS classes,
GROUP_CONCAT(DISTINCT TT.`tution_name`) AS tution_type,
GROUP_CONCAT(DISTINCT TL.`name`) AS locations
FROM `tutor_profile` TP
LEFT JOIN `tutor_to_subject` TTS ON TP.`tutor_id`=TTS.`tutor`
LEFT JOIN `tutor_subjects` TS ON TS.`subject_id`=TTS.`subject`
LEFT JOIN `tutor_to_class` TTC ON TP.`tutor_id`=TTC.`tutor`
LEFT JOIN `tutor_classes` TC ON TC.`class_id`=TTC.`class`
LEFT JOIN `tutor_to_tution_type` TTTT ON TP.`tutor_id`=TTTT.`tutor`
LEFT JOIN `tution_types` TT ON TT.`tution_id`=TTTT.`tution_type`
LEFT JOIN `tutor_to_locality` TTL ON TP.`tutor_id`=TTL.`tutor`
LEFT JOIN `tutor_locality` TL ON TL.`id`=TTL.`locality`
WHERE 1=1 AND TP.`status` = 1
GROUP BY TP.`tutor_id`
ORDER BY TP.`date_added` DESC LIMIT 0 , 25
有没有办法提高它的性能?
解决方案
您可以尝试在输出列表中使用相关子查询,而不是 JOIN 和 GROUP BY:
SELECT
TP.*,
( SELECT GROUP_CONCAT(DISTINCT TS.`subject_name`)
FROM `tutor_to_subject` TTS
LEFT JOIN `tutor_subjects` TS ON TS.`subject_id`=TTS.`subject`
WHERE TP.`tutor_id`=TTS.`tutor` ) AS subjects,
-- the same for another output columns
FROM `tutor_profile` TP
WHERE 1=1 AND TP.`status` = 1
ORDER BY TP.`date_added` DESC LIMIT 0 , 25
推荐阅读
- windows - Delphi Rio 应用程序无法在 Windows 2003 Server 上启动(缺少 d2d1.dll)
- google-api - Gmail Postmaster 工具 API
- python - Heroku 在部署 Flask 应用程序时显示错误 Method Not Allowed
- json - JSON 模式定义集合中元素的单一用途
- kubernetes - 如何从一台 linux 机器访问另一台主机上的 k8s
- node.js - 尝试启动反应应用程序时出错
- python - Beautifulsoup get_text()函数不起作用
- python-3.x - ModuleNotFoundError:没有名为“astor”的模块
- node.js - Nestjs 在容器启动时退出
- machine-learning - 权重初始化的预训练深度学习模型