【发布时间】:2018-08-30 02:51:17
【问题描述】:
在我的查询中添加 ORDER BY 时遇到问题。
没有 ORDER BY 查询大约需要 26ms,只要我添加一个 ORDER BY,它就需要大约 20s。
我尝试了几种不同的方法,但似乎可以减少时间。
试过了
FORCE INDEX (PRIMARY)
尝试包装 SELECT * FROM (...)
还有人有其他想法吗?
查询:
SELECT
orders.id AS order_number,
orders.created AS order_created,
CONCAT_WS(' ', clients.name, office.name) AS client_office,
order_item.code AS product_code,
order_item.name AS product_name,
order_item.description AS product_description,
order_item.sale_price,
jobs.rating AS job_rating,
job_role.start_booking AS book_start,
job_role.end_booking AS book_end,
CONCAT_WS(' ', admin_staffs.first_name, admin_staffs.last_name) AS soul,
admin_roles.name AS role,
services.name AS service,
COUNT(job_item.id) AS total_assets,
COALESCE(orders.project_name, CONCAT_WS(' ', orders.location_unit_no, orders.location_street_number, orders.location_street_number, orders.location_street_name
)
) AS order_title
FROM jobs
LEFT JOIN job_item ON jobs.id = job_item.job_id
LEFT JOIN job_role ON jobs.id = job_role.job_id
LEFT JOIN admin_roles ON admin_roles.id = job_role.role_id
LEFT JOIN services ON services.id = jobs.service_id
LEFT JOIN admin_staffs ON admin_staffs.id = job_role.staff_id
LEFT JOIN order_item ON jobs.item_id = order_item.id
LEFT JOIN orders ON orders.id = order_item.order_id
LEFT JOIN clients ON orders.client_id = clients.id
LEFT JOIN office ON orders.office_id = office.id
LEFT JOIN client_users ON orders.user_id = client_users.id
GROUP BY jobs.id
ORDER BY jobs.order_id DESC
LIMIT 50
解释:
+----+-------------+--------------+--------+------ ----------+------------+---------+------ ---------------------+--------+-------- -------------+ |编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 | +----+-------------+--------------+--------+------ ----------+------------+---------+------ ---------------------+--------+-------- -------------+ | 1 |简单 |职位 |全部 |初级 |空 |空 |空 | 49555 |使用临时的;使用文件排序 | | 1 |简单 |工作项目 |参考 |工作ID |工作ID | 5 | Wx3392vf_UCO_app.jobs.id | 8 |使用哪里;使用索引 | | 1 |简单 |工作角色 |参考 |工作ID |工作ID | 4 | Wx3392vf_UCO_app.jobs.id | 1 |使用位置 | | 1 |简单 |管理员角色 | eq_ref |初级 |初级 | 4 | wx3392vf_UCO_app.job_role.role_id | 1 |使用位置 | | 1 |简单 |服务 | eq_ref |初级 |初级 | 4 | Wx3392vf_UCO_app.jobs.service_id | 1 |使用位置 | | 1 |简单 | admin_staffs | eq_ref |初级 |初级 | 4 | wx3392vf_UCO_app.job_role.staff_id | 1 |空 | | 1 |简单 |订单项 | eq_ref |初级 |初级 | 4 | Wx3392vf_UCO_app.jobs.item_id | 1 |使用位置 | | 1 |简单 |订单 | eq_ref |初级 |初级 | 4 | Wx3392vf_UCO_app.order_item.order_id | 1 |使用位置 | | 1 |简单 |客户 | eq_ref |初级 |初级 | 4 | Wx3392vf_UCO_app.orders.client_id | 1 |使用位置 | | 1 |简单 |办公室 | eq_ref |初级 |初级 | 4 | Wx3392vf_UCO_app.orders.office_id | 1 |使用位置 | | 1 |简单 |客户用户 | eq_ref |初级 |初级 | 4 | wx3392vf_UCO_app.orders.user_id | 1 |使用索引 | +----+-------------+--------------+--------+------ ----------+------------+---------+------ ---------------------+--------+-------- -------------+【问题讨论】:
-
当你没有聚合或任何东西时,你为什么要使用 GROUP BY?这很可能会产生不稳定的结果,虽然 MySQL 允许,但不应该这样做。 id 可能有重复也听起来很奇怪,通常它是一个唯一的列。查询需要更长的时间,因为没有它它只能返回任何 50 行,所有行都必须处理。
-
GROUP BY是给COUNT的,没有它会统计job_item中的所有记录并返回一个结果
-
我建议调整服务器的设置,以便在分组和修复基于这些的查询时会产生不使用聚合等错误。它可能对这个问题没有帮助,但当查询至少是确定的时它会有所帮助。
-
谢谢@SamiKuhmonen 我会调查的。
-
如果您从查询中删除所有连接并尝试从
jobs表中仅获取一列并生成order by。会有多快?我认为您应该使用这种策略并尝试找出瓶颈在哪里。