【问题标题】:MYSQL slow ORDER BYMYSQL 慢 ORDER BY
【发布时间】: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。会有多快?我认为您应该使用这种策略并尝试找出瓶颈在哪里。

标签: mysql join left-join


【解决方案1】:

尝试从这个查询开始:

SELECT * FROM jobs ORDER BY jobs.order_id DESC LIMIT 50

然后通过添加更多连接来增加其复杂性:

SELECT * FROM jobs 
LEFT JOIN job_item ON jobs.id = job_item.job_id
ORDER BY jobs.order_id DESC LIMIT 50

等等

在每一步进行分析,您将能够找到瓶颈。可能是其中一个联接表中的某个 TEXT 字段减慢了查询速度或其他原因。

【讨论】:

  • 通过这个方法,发现@SamiKuhmonen 走上了正轨。删除GROUP BY 似乎可以解决问题。我涉足了各个方面,当我注释掉 GROUP BY 8.5 ms 所以从 dba.stackexchange.com/questions/86056/…> 重写了 COUNT
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 2020-05-15
相关资源
最近更新 更多