【发布时间】:2010-06-28 05:04:26
【问题描述】:
以下查询有效,但 10 条记录(2 秒)的速度非常慢。分析说它创建了一个 tmp 表,但我不确定为什么。
基本上,我将当前用户加入 acl 组,获取他们所在的所有组,然后将组加入公司,获取他们所在的所有公司,然后将公司加入订单,得到所有的订单..
如果我删除这一行
ORDER BY orders.created_on DESC
然后查询在 0.06 秒内执行(超过可接受的时间)..
帮助,关于如何优化的任何想法?非常感谢:)
SELECT
orders.uuid,
companies.name as company_name
FROM
users u
JOIN
users_acl_groups g on u.uuid = g.user_uuid
JOIN
users_acl acl on (acl.user_uuid = u.uuid or acl.group_uuid = g.group_uuid)
JOIN
companies on acl.item_uuid = companies.uuid
JOIN
orders on companies.uuid = orders.company_uuid
WHERE
u.uuid = 'DDEC8073-5056-C000-01ED583A51CBCA32' and orders.status <> ''
ORDER BY orders.created_on DESC
limit 0, 10;
UPDATE,查询的解释..
1 SIMPLE 订单 ALL 9403 使用 暂时的;使用文件排序
1 SIMPLE acl ALL 1859 使用 where; 使用连接缓冲区
1 SIMPLE g ALL 2005 使用 where; 使用连接缓冲区
1 SIMPLE 公司 eq_ref PRIMARY PRIMARY 52 table.orders.company_uuid 1
1 SIMPLE u ALL 33595 使用 where; 清楚的;使用连接缓冲区
【问题讨论】:
-
修改了你的标题,因为当你的问题措辞得当时,猜测它的必要性和苛刻的语气会让你付出一票否决权。
-
尝试使用相同的查询,并将联接应用于除 UID 以外的任何列。尝试使用 int、float、string、UID 并注意时间。如果您发现任何变化,请告诉我们。
-
你有关于 orders.created_on 的索引吗?在您的查询中显示
EXPLAIN上的输出。也许您可以从其他索引中受益。EXPLAIN会告诉我们。 -
是的,
EXPLAIN会有所帮助。看起来,如果没有ORDER BY,则用户可以进行查询,并与订单进行小连接;并与ORDER BY反向,从订单、公司、acl(可能是 tmp 表的内容)之间的大型笛卡尔连接,然后最终与过滤后的用户连接... -
users.uuid是否已编入索引? (可能是唯一索引)奇怪的是查询并没有试图减少更胖的表......
标签: mysql sql performance query-optimization