mysql查询可以在一台服务器上工作,但不能在另一台服务器上工作

vuv7lop3  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(490)

我正在将我们的mysql服务器(5.7.15)迁移到一个功能更强大的专用框(5.7.24,大约两周前由mysqldump从旧服务器创建的数据/模式),并且必须重新创建mysql dump没有保留的所有服务器设置。我有这个问题(不是我写的):

  1. SELECT *
  2. FROM (SELECT t1.job_status,
  3. t1.customer_po,
  4. t1.customer_name,
  5. t1.order_value,
  6. t1.code_division,
  7. t1.assigned_sales_person,
  8. t1.date_assigned,
  9. t2.date_order,
  10. IF(t1.job_status = 'PENDING',
  11. Datediff(Curdate(), t1.date_assigned),
  12. Datediff(t2.date_order, t1.date_assigned)) AS days,
  13. force4.Code('DV', t1.code_division) AS code_desc,
  14. t2.order_id
  15. FROM customer_po_log AS t1
  16. left join orders AS t2
  17. ON t2.po_id = t1.customer_po
  18. left join order_item AS t3
  19. ON t3.order_id = t2.order_id
  20. AND t3.code_division = t1.code_division
  21. GROUP BY t1.customer_po) AS u1
  22. WHERE u1.job_status = 'PENDING'
  23. AND u1.code_division = 'L'
  24. ORDER BY u1.days DESC

在原始服务器上,查询在0.5秒内完成。在新服务器上,它超过了最大查询时间。我很确定问题源于t3连接,因为“解释当前语句”工具告诉我:


是否存在阻止此查询对新框执行相同操作的设置?造成这种差异的原因是什么?
很乐意提供任何额外的必要信息。谢谢!

vngu2lb8

vngu2lb81#

将表从一台服务器迁移到另一台服务器时,请始终检查以下几点:
您确定新服务器上的表与旧服务器上的表具有相同的索引吗?做 SHOW CREATE TABLE tbl; 检查。
你做了什么 OPTIMIZE TABLE tbl; 对于迁移后的每个表?也可以在命令行中使用 mysqlcheck -o --all-databases 优化或分析表会重新生成一些内部统计信息。这些统计信息可以帮助mysql的查询规划人员在查询时选择索引,因此有时可以避免对完整表或索引进行扫描。

6bc51xsx

6bc51xsx2#

)如果有 SHOW CREATE TABLE 以及 EXPLAIN SELECT... )
如果没有这些索引,它们可能有助于提高速度(在两台机器上):

  1. t2: (po_id, order_id, date_order) -- with `po_id` first
  2. t3: (order_id, code_division) -- in either order

此外,连接到 t3 似乎完全没用。因为优化器可能不够聪明,无法为您删除它,所以您应该这样做。
然后移动 WHERE 里面
把外皮去掉 SELECT .
啊,见鬼,这里:

  1. SELECT t1.job_status, t1.customer_po, t1.customer_name, t1.order_value,
  2. t1.code_division, t1.assigned_sales_person, t1.date_assigned,
  3. t2.date_order,
  4. Datediff(Curdate(), t1.date_assigned)) AS days,
  5. force4.Code('DV', t1.code_division) AS code_desc,
  6. t2.order_id
  7. FROM customer_po_log AS t1
  8. LEFT JOIN orders AS t2 ON t2.po_id = t1.customer_po
  9. WHERE u1.job_status = 'PENDING'
  10. AND u1.code_division = 'L'
  11. ORDER BY u1.days DESC

  1. t1: INDEX(job_status, code_division) -- in either order
  2. t2: INDEX(po_id, order_id, date_order) -- with `po_id` first

好吧,你没有写代码。但你现在有责任清理它。否则下一个开发者会把矛头指向你。

展开查看全部

相关问题