【问题标题】:Best index for mysql date fieldmysql日期字段的最佳索引
【发布时间】:2018-09-09 14:38:24
【问题描述】:

我有一个包含 41,000,000 行的表,其结构如下:

date最佳索引是什么,以启用这样的快速过滤

select count(*) from market_db_candle where date >= 2018-09-05 and date <= 2018-09-09;

【问题讨论】:

  • stackoverflow.com/questions/1108/… 上有一个出色的社区 wiki 描述索引如何工作。了解它们的工作原理将帮助您确定哪些索引最能满足您的需求。最后,变量太多了,最好的办法是实现索引、更新统计信息、检查查询性能和解释计划。
  • 另一个提示:去掉id,改成PRIMARY KEY(symbol_id, date, time)tf 是什么?你真的需要8字节的DOUBLEs吗?

标签: mysql date indexing


【解决方案1】:

对于您显示的查询,您不能比您已经拥有的date 上的索引做得更好。该查询将检查与日期范围匹配的所有行,但至少不会检查日期范围之外的任何行。如果这使查询检查数千或数百万行,那将无济于事。它必须检查行数。

如果您需要在更短的时间内计算行数的查询,一种策略是创建第二个表,每个日期存储一行,以及与该日期关联的计数。

CREATE TABLE market_db_candle_count_by_day (
  date DATE PRIMARY KEY,
  count INT UNSIGNED NOT NULL
);

用每天的计数填充它:

INSERT INTO market_db_candle_count_by_day
SELECT date, COUNT(*)
FROM market_db_candle
GROUP BY date;

然后你可以查询计数的总和:

select sum(count) as count from market_db_candle_count_by_day 
where date >= '2018-09-05' and date <= '2018-09-09';

您可以让后一个表保持同步,并在必要时对其进行更新。

PS:将日期文字放在单引号内。

【讨论】:

    猜你喜欢
    • 2011-04-19
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多