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
但是这个结构似乎不符合我的需要:
- 似乎没有处理异常(事件每周六重复,但不是这个)
- 我担心从
repeat_start
和 repeat_interval
获取日期所需的计算时间会比当前的 select 时间长。
是否有更好的 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
.
我有一个日历,用于为任何用户存储基于日期(而非日期时间)的信息。
在我的网站上,用户可以 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
但是这个结构似乎不符合我的需要:
- 似乎没有处理异常(事件每周六重复,但不是这个)
- 我担心从
repeat_start
和repeat_interval
获取日期所需的计算时间会比当前的 select 时间长。
是否有更好的 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
.