【发布时间】:2018-05-23 02:22:20
【问题描述】:
我正在尝试优化查询,但解释查询给出 mysql 没有使用任何索引。
这是我的查询:
explain
SELECT t1.*
FROM crypto_screener.prices as t1 FORCE INDEX (PRIMARY)
where t1.id = (
select t2.id
from (select *
from
crypto_screener.prices FORCE INDEX (allfilters)
where date > '2017-12-07'
) as t2
where t2.symbol = t1.symbol
order by t2.id desc
limit 1
)
;
这是show index from prices;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
prices 0 PRIMARY 1 id A 57718 NULL NULL BTREE
prices 0 priceid 1 id A 57718 NULL NULL BTREE
prices 1 pricefilters 1 symbol A 369 NULL NULL YES BTREE
prices 1 pricefilters 2 date A 57718 NULL NULL YES BTREE
prices 1 datefilters 1 date A 506 NULL NULL YES BTREE
prices 1 symbolfilters 1 symbol A 421 NULL NULL YES BTREE
prices 1 allfilters 1 id A 57718 NULL NULL BTREE
prices 1 allfilters 2 symbol A 57718 NULL NULL YES BTREE
prices 1 allfilters 3 date A 57718 NULL NULL YES BTREE
查询现在不会以表内的数据量运行。我该如何优化它?
【问题讨论】:
-
你不能在这里使用
allfilters(因为它的索引超过 3 列并且日期不是索引中的第一列,所以基本上这个索引是无用的,因为你已经在id) 你能用datefilters吗? -
@RolandStarke 是的,日期过滤器适用于 t2
-
太棒了。是否足以提高性能?我无法理解此查询选择的内容。知道会很有趣。
-
@RolandStarke 表格价格有 t 个日期的 n 个符号的价格。查询为每个交易品种选择最近的行,其中包含最后的价格(最高 id)。使用日期过滤器,运行查询还不够。
-
这适用于子查询 t2。 @O.Jones 我在上面的评论中解释了
标签: mysql query-optimization greatest-n-per-group