【发布时间】:2018-07-04 13:36:16
【问题描述】:
您好,我正在尝试优化此查询。 如果时间范围内有很多事务,则在我的本地环境中执行最多可能需要 10 秒。 我试图在 created_at 列上创建一个索引,但如果表中有很多行(我的表只有 4m 行),它并不能解决问题。 有人可以推荐一些优化技巧吗?
select
count(*) as total,
trader_id
from
(select *
from `transactions`
where `created_at` >= '2018-05-04 10:54:00'
order by `id` desc)
as `transactions`
where
`transactions`.`market_item_id` = 1
and `transactions`.`market_item_id` is not null
and `gift` = 0
group by `trader_id`;
编辑:
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE transactions NULL range transactions_market_item_id_foreign,transactions_trader_id_foreign,transactions_created_at_index transactions_created_at_index 5 NULL 107666 2.41 Using index condition; Using where; Using MRR; Using temporary; Using filesort
【问题讨论】:
-
可以分享一下执行计划吗?
-
我会将外部查询中的 where 子句移至内部查询。从一开始您就会选择较少的结果
-
我知道为什么不能是一个简单的查询而不是查询中的子查询
-
一团糟——您可以将内部和外部查询组合成一个查询。您不需要 order by 子句。您的“market_item_id is not null”子句没有任何意义,因为您还只选择了该列 = 1 的行。一旦这样做,created_at、market_item_id、gift 上的索引就可以完成这项工作。
标签: mysql database database-optimization