如何重写这个嵌套的 SQL 查询以使其更快? [关闭]
Posted
技术标签:
【中文标题】如何重写这个嵌套的 SQL 查询以使其更快? [关闭]【英文标题】:How to rewrite this nested SQL query to make it faster? [closed] 【发布时间】:2020-10-09 00:51:26 【问题描述】:此查询返回 16000 条记录,大约需要 3-4 分钟!我在查询末尾添加了 LIMIT 10,但没有任何区别。
更新:这里是解释输出:
$sql = "
SELECT *,GROUP_CONCAT(`firstName`,' ',`lastName` SEPARATOR '<br/>') AS `users`
from (SELECT `frk_item`.`itemId`,`frk_quotes`.`quoteId`,`frk_item`.`title`,`quoteno`,`gmp`,`value`,`values`,`status`,`dates`,`firstName`,`lastName`,`name`,`frk_quoteuser`.`userid`
FROM `frk_item` INNER JOIN `frk_quotes` ON `frk_item`.`itemId` = `frk_quotes`.`itemId`
LEFT JOIN `frk_project` ON `frk_project`.`projectId` = `frk_item`.`projectId`
LEFT JOIN `frk_quoteuser` ON `frk_quoteuser`.`quoteId`=`frk_quotes`.`quoteId`
LEFT JOIN `frk_member` ON `frk_member`.`memberId` = `frk_quoteuser`.`userId`
WHERE `frk_quotes`.`varis`='original' AND `frk_quotes`.`status`!='0'" . $filter . "
order by `frk_item`.`quoteno` DESC) as `poop`
GROUP BY `quoteId`
ORDER BY `quoteno` DESC";
更新: Rick James 关于添加索引的建议解决了这个问题。现在加载记录需要 2-3 秒
【问题讨论】:
该查询的explain
显示了什么?
感谢保罗编辑它。抱歉,你说的解释是什么意思?
谢谢,我应该添加到我之前的评论中,需要查看同时显示两个表的索引的部分。为两个表而不是图片添加来自SHOW CREATE TABLE tableName
的输出可能更容易。
请阅读此内容,尤其是。关于查询性能的部分。 meta.***.com/questions/271055/… 那么请edit您的问题提供我们需要帮助您的信息。
请以可用的形式分享表格结构(作为文本,而不是作为图像!)
【参考方案1】:
从 MyISAM 切换到 InnoDB。
什么是$filter
?
status
有多少个不同的值?如果只有两个,那就改成AND status = 1
。
frk_quotes
:加INDEX(varis, status, quoteId, itemId)
frk_quoteuser
需要INDEX(quoteId, userId)
这似乎没用:LEFT JOIN frk_member
ON frk_member
.memberId
= frk_quoteuser
.userId
。如果不需要,请不要包含它。
移除内层 ORDER BY
;它没有任何用处。
请限定每一列。
INT(4)
上的 (4)
没有任何意义。请参阅 TINYINT
及其兄弟姐妹。
由于GROUP BY
和ORDER BY
不同,可能还有第二种。
LIMIT 10
是无用的,因为没有办法设计单个索引来处理WHERE
和 GROUP BY
和 ORDER BY
。这就是所有的工作都完成了,然后交付了 10 行。这样可以节省网络流量,但在此之前没有任何工作。
尽可能解决这些问题,然后在需要时回来接受更多批评。
【讨论】:
谢谢。添加两个索引修复了性能问题。索引将加载时间从 3-4 分钟减少到 2-3 秒 有时索引是那么壮观。 (但并非总是如此。)以上是关于如何重写这个嵌套的 SQL 查询以使其更快? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章