基本上,我将当前用户与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;
更新,查询的解释...
1 SIMPLE orders 全部扫描 9403 使用临时表; 使用文件排序
1 SIMPLE acl 全部扫描 1859 使用where语句; 使用连接缓存
1 SIMPLE g 全部扫描 2005 使用where语句; 使用连接缓存
1 SIMPLE companies 等值连接 主键 PRIMARY 52 table.orders.company_uuid 1
1 SIMPLE u 全部扫描 33595 使用where语句; 去重; 使用连接缓存
EXPLAIN
的输出。也许你可以从其他索引中受益。哪个EXPLAIN
告诉我们这一点。 - nosEXPLAIN
可以帮助解释查询执行计划。看起来,如果没有ORDER BY
,查询会从用户开始,逐步连接小表直到订单;而有了ORDER BY
后,则需要先进行大量的笛卡尔积操作,连接订单、公司、acl(也许是 tmp 表的内容),最后再与筛选后的用户表进行连接。 - pascalusers.uuid
是否被索引了?(可能是唯一索引)很奇怪查询没有尝试减少较大的表... - pascal