【发布时间】:2021-09-06 00:29:53
【问题描述】:
我的客户获得了以下代码,他每天都使用它来计算在他的网站上发送给企业的消息。我查看了 MYSQL.SLOW.LOG,它有以下查询的统计数据,这表明它需要优化。
计数:183 时间=44.12s (8073s) 锁定=0.00s (0s) Rows_sent=17337923391683297280.0 (-1), Rows_examined=382885.7 (70068089), Rows_affected=0.0 (0), thewedd1[thewedd1]@localhost
查询是:
SELECT
businesses.name AS BusinessName,
messages.created AS DateSent,
messages.guest_sender AS EnquirersEmail,
strip_tags(messages.message) AS Message,
users.name AS BusinessName
FROM
messages
JOIN users ON messages.from_to = users.id
JOIN businesses ON users.business_id = businesses.id
我的 SQL 不是很好,但是 LEFT JOIN 而不是 JOIN 是否有助于减少返回的行数或行数?我已经运行了一个 EXPLAIN 查询,它似乎在 LEFT JOIN 和 JOIN 之间没有区别..
基本上我认为减少返回的行数会很好,因为它太大了..
【问题讨论】:
-
检查你的执行计划和索引。根据您提供的信息,查询是完全正常的,没有什么可以改进的(除了@AKX指出的)
-
LEFT JOINs 只能增加加入的行数。 -
您确定您的查询一开始就正确吗?它有两列别名为 BusinessName...
-
my client was given the following code and he uses it daily to count the messages sent... 如果这纯粹是为了计数,为什么不适当地聚合结果,而不是返回所有匹配的行并让客户端/应用程序计数?这就是减少返回行的方式。然而,这个问题并没有解释整个/明确的要求。 -
strip_tags不是 MySQL 内置函数。提供它的代码......也许它是问题的根源?
标签: mysql sql optimization