【mysql】最近写了几个sql,查询起来很慢,走了索引也慢

t_user_order表是数据量最大的,索引走的lab_id
`SELECT DISTINCT
ta.lab_confirm_time,
ta.lab_id,
tl.lab_name_abbr,

IF (
ta.is_end = '1',
ta.account_paid,
ta.account_payable
) AS money,
ta.account_payable,
ta.account_paid,
ta.is_end,
ta.order_id,
te.sample_num AS test_sample_num,
te.item_id
FROM
t_user_order ta
LEFT JOIN t_user_register_item tu ON ta.order_id = tu.order_id
LEFT JOIN t_test_trust tt ON ta.order_id = tt.order_id,
t_user_item te,
zkjy_lab.t_item ti,
t_lab AS tl
WHERE
ta.lab_id = tl.lab_id
AND ta.order_id = te.order_id
AND te.item_id = ti.item_id
AND ta.order_status IN ('04', '05')
AND ta.lab_confirm_time >= '2019-06-01 00:00:00'
AND ta.lab_confirm_time <= '2020-07-06 00:00:00'`

【mysql】最近写了几个sql,查询起来很慢,走了索引也慢
补充一下,正常的话至少几千条数据,时间长点就几万了,由于表结构问题,查询后还要对数据进行处理

回答

使用 mysql explain查看sql的执行计划

把left join on的部分建立所以 where条件建立索引 后面那部分三个表连表写成显示链表

force index(lab_confirm_time) 试试 当然跨度是一年这么就得话估计效果也不好。 另外最后的几张表的关联最好也显示的写成join的形式

看你贴的SQL看得话,left jion 的俩个表 tt tu 根本没有使用,不知道为什么需要关联。

  • tt,tu两张表没有用到就不要关联,
  • t_user_item,t_item,t_lab,这三张表也用left join,
  • 给order_id,lab_id,item_id,lab_confirm_time建索引,
  • 时间范围用between,
  • 还有order_status如果不是varchar的话,条件要去掉引号,否则不走索引。

大概就这些,具体还要看explain。

如果还不行,就分开查,然后通过程序在内存里面组装数据。

以上是 【mysql】最近写了几个sql,查询起来很慢,走了索引也慢 的全部内容, 来源链接: utcz.com/a/74793.html

回到顶部