【发布时间】:2014-07-31 04:26:40
【问题描述】:
下面是 MySQl 查询,我可以通过它获得不想要的结果
但是有什么办法可以优化查询
SELECT users.*,
(SELECT country_name FROM country WHERE country_code = users.country_code)
AS country_name,
(SELECT zone_name FROM timezone WHERE timezone_id = users.timezone_id)
AS zone_name,
(SELECT GROUP_CONCAT(list_name)
FROM list LEFT JOIN user_list ON user_list.list_id = list.list_id
WHERE user_list.user_id = users.user_id AND user_list.status = "active")
AS groups,
(SELECT GROUP_CONCAT(promotion_name)
FROM promotion LEFT JOIN promotion_user ON promotion_user.promotion_id = promotion.promotion_id
WHERE promotion_user.user_id = users.user_id AND promotion_user.status = "active")
AS promotions,
(SELECT GROUP_CONCAT(full_name)
FROM users u LEFT JOIN promotion_user ON promotion_user.promotor_id = u.user_id
WHERE promotion_user.user_id = users.user_id AND promotion_user.status = "active")
AS promotors
FROM users WHERE client_id = '2' AND status != 'deleted'
ORDER BY user_id desc
LIMIT 50 OFFSET 0
解释输出是
可能的钥匙 id select_type table type _keys key _len ref rows Extra 1 PRIMARY 用户索引 NULL PRIMARY 4 NULL 1045612 使用 where 6 DEPENDENT SUBQUERY Promotion_user ALL NULL NULL NULL NULL 16159 使用 where 6 相关子查询 u eq_ref PRIMARY PRIMARY 4 [1] 1 NULL 5 DEPENDENT SUBQUERY Promotion_user ALL NULL NULL NULL NULL 16895 使用 where 5 DEPENDENT SUBQUERY 提升 ALL PRIMARY NULL NULL NULL 4 使用 where;使用连接缓冲区(块嵌套循环) 4 相关子查询列表 ALL PRIMARY NULL NULL NULL 1592 NULL 4 DEPENDENT SUBQUERY user_list ALL NULL NULL NULL NULL 159852 使用where;使用连接缓冲区(块嵌套循环) 3 DEPENDENT SUBQUERY 时区 eq_ref PRIMARY PRIMARY 4 [2] 1 NULL 2 DEPENDENT SUBQUERY country ALL NULL NULL NULL NULL 239 使用 where [1] test.promotion_user.promoter_id [2] test.promotion_user.promoter_id【问题讨论】:
-
发布查询的 EXPLAIN 输出会有所帮助。
-
还显示表的 DDL(或告诉我们哪些列被索引,存在哪些关系等)
-
考虑到复杂性 Fiddle 会很好。
-
你能张贴表声明。查看您发布的 EXPLAIN 输出,您似乎在表上几乎没有有用的索引。缺少索引可能会大大减慢速度。
标签: mysql