【发布时间】:2020-12-02 02:58:29
【问题描述】:
我有一个带有 apx 的表 (MYSQL 8)。 100M 条记录存储各种位的股票数据(价格、日期等),下面的查询 A 运行时间 date 上有一个索引,表的主键是(symbol,date)。什么会导致这两个查询之间出现如此显着的差异,以及什么可能会加快表现不佳的速度?
查询 A:
SELECT symbol, MIN(date)
FROM Stocks
WHERE date BETWEEN '2015-01-01' AND '2020-01-01'
GROUP BY symbol
查询 B
SELECT symbol, MIN(date)
FROM Stocks
WHERE date BETWEEN '2015-01-01' AND '2020-01-01' AND market_cap > 20
GROUP BY symbol
我面临的另一个挑战是,有时我想按market_cap 进行过滤,但有时我想按其他数字字段(gross_profit、total_assets 等)进行过滤。查询是由一个表单生成的,该表单具有许多与参数相关的可选输入。
表架构
CREATE TABLE IF NOT EXISTS cri_v0_995 (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
company_id MEDIUMINT UNSIGNED NOT NULL,
dt DATE NOT NULL,
price DECIMAL(18, 2),
market_cap DECIMAL(12, 4),
div_yield DECIMAL(4,2), -- this is always 0
price_to_nte DOUBLE,
price_to_mte DOUBLE,
nte_to_price DECIMAL(16, 10),
ante_to_price DECIMAL(16, 10),
ate_to_price DECIMAL(18, 10),
price_to_sales DOUBLE,
price_to_earnings DOUBLE,
cur_liq_to_mcap DECIMAL(4, 2), -- this is always 0
net_liq_to_mcap DOUBLE,
g3_rev_growth_and_trend DECIMAL(14, 10),
p_cri_score DECIMAL(14, 10),
f_cri_score DECIMAL(10, 7),
cri_score DECIMAL(14, 10),
PRIMARY KEY (id),
FOREIGN KEY (company_id) REFERENCES companies (id),
UNIQUE KEY (company_id, dt)
);
请注意,有几个列我不确定。它们一直是零,但我不知道它们背后的意图是什么。
(编辑 1 以解决缺少的GROUP BYs)
(编辑 2 添加表架构)
【问题讨论】:
-
您的查询格式错误。它们是没有
group by的聚合查询,但select中有未聚合的列。 -
是的,这两个查询都是格式错误的。这意味着他们正在返回随机结果,而您可能没有意识到这一点。 不要在生产环境中使用这些查询。
-
射击,感谢戈登和穿刺者。
GROUP BY是我正在测试的查询的一部分,我只是将它们复制到这里很糟糕。 -
显然你想索引market_cap
-
您的日期范围是 5 年加 1 天。当心
BETWEEN。