【问题标题】:How to rewrite this nested SQL query to make it faster? [closed]如何重写这个嵌套的 SQL 查询以使其更快? [关闭]
【发布时间】:2023-03-12 10:21:01
【问题描述】:

此查询返回 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.stackoverflow.com/questions/271055/… 那么请edit您的问题提供我们需要帮助您的信息。
  • 请以可用的形式分享表格结构(作为文本,而不是作为图像!)

标签: php mysql query-performance


【解决方案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 BYORDER BY 不同,可能还有第二种。
  • LIMIT 10 是无用的,因为没有办法设计单个索引来处理WHERE GROUP BY ORDER BY。这就是所有的工作都完成了,然后交付了 10 行。这样可以节省网络流量,但在此之前没有任何工作。

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

【讨论】:

  • 谢谢。添加两个索引修复了性能问题。索引将加载时间从 3-4 分钟减少到 2-3 秒
  • 有时索引是那么壮观。 (但并非总是如此。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多