如何重写这个嵌套的 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。 什么是$filterstatus 有多少个不同的值?如果只有两个,那就改成AND status = 1frk_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 BYORDER BY 不同,可能还有第二种。 LIMIT 10 是无用的,因为没有办法设计单个索引来处理WHERE GROUP BY ORDER BY。这就是所有的工作都完成了,然后交付了 10 行。这样可以节省网络流量,但在此之前没有任何工作。

尽可能解决这些问题,然后在需要时回来接受更多批评。

【讨论】:

谢谢。添加两个索引修复了性能问题。索引将加载时间从 3-4 分钟减少到 2-3 秒 有时索引是那么壮观。 (但并非总是如此。)

以上是关于如何重写这个嵌套的 SQL 查询以使其更快? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

什么可以替换查询中的 IN 子句以使其更快?

优化 sql 查询如何使其更快

您如何重写/重新编码网站以使其具有可扩展性? [关闭]

重写有状态代码以使其更干

使这个查询更快

如何优化此查询并使其执行得更快? [关闭]