Table 日历结构 - 根据日期存储数据

Table structure for calendar - Store data based on date

我有一个日历,用于为任何用户存储基于日期(而非日期时间)的信息。

在我的网站上,用户可以 select 一个特定的日期,并在这个日期填写一些关于他自己的信息。 此时,我的 table 结构看起来像这样

+----+---------+------------+-----------+
| id | user_id | event_date | data      |
+----+---------+------------+-----------+
|  1 |      25 | 2015-08-25 | Some Data |
+----+---------+------------+-----------+

实际上,列数据并不存在,而是有多个布尔列,但这样更简单。
重要的是我需要在一天内为每个用户获取所有数据字段。它需要尽可能快。
现在,我只是 运行 以下查询。

SELECT `data` FROM `calendar` WHERE `event_date` = '2015-07-08'

我的问题是,在这种结构下,我的 table 的大小会随着时间逐渐增加,并且从这个 table 到 SELECT 的速度越来越慢(目前~20 000 000 行)。
我已经删除了超过一年的数据,但由于用户数量在增加,所以我的 table.

一个小的精度,在网站上,用户能够使用某种重复事件来填充日历。看起来像下面这样:

For Every Monday & Saturday From [start_date] to [end_date], set data="Some Value".

因此,我想知道使用 table 结构来存储重复事件是否不比当前的 table 更好。 我见过this answer(和其他类似的)提出以下结构

Assuming I have two tables, one called events like this:

ID    NAME
1     Sample Event
2     Another Event

And a table called events_meta like this:

ID    event_id      meta_key           meta_value
1     1             repeat_start       1299132000
2     1             repeat_interval_1  432000

但是这个结构似乎不符合我的需要:

是否有更好的 table 结构来存储日期数据?正如我所说,我的需要是尽快获取特定日期的每个用户的数据。

PS : 我的 event_date 栏中已经有一个 INDEX。

这里是查询的解释和 SHOW CREATE 的结果 TABLE

+----+-------------+----------+------+---------------+------------+---------+-------+--------+-------+
| id | select_type | table    | type | possible_keys | key        | key_len | ref   | rows   | Extra |
+----+-------------+----------+------+---------------+------------+---------+-------+--------+-------+
|  1 | SIMPLE      | calendar | ref  | event_date    | event_date | 3       | const | 127591 | NULL  |
+----+-------------+----------+------+---------------+------------+---------+-------+--------+-------+

CREATE TABLE IF NOT EXISTS `calendar` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `event_date` date NOT NULL,
  `data` varchar(128) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_index` (`user_id`,`event_date`),
  KEY `event_date` (`event_date`)
)

没有改善。

你有 INDEX(event_date)。真正的 'problem' 是该 EXPLAIN 中使用的 event_date 大约有 127K 行。从磁盘中获取那么多行需要很长时间。

好的,可能 是一种改进此查询的方法 -- 但它可能会以牺牲其他查询为代价。为了知道提出什么(以及是否)提出建议,请提供

  • SHOW CREATE TABLE
  • 其他重要的SELECTs.
  • 典型的一天有多少行?一个典型用户有多少行?

您实际上在客户端中使用了所有 127K 行吗?或者你做进一步的过滤?还是合并(求和、计数等)?也许其中一些内容可以移至 SELECT.