目前,我有一个mySQL表,其列的内容如下所示:
run_date DATE
name VARCHAR(10)
load INTEGER
sys_time TIME
rec_time TIME
valid TINYINT
列valid
本质上是一个有效位,如果此行是此(run_date,name)对的最新值,则为1,否则为0。为了简化插入,我编写了一个存储过程,首先运行UPDATE table_name SET valid = 0 WHERE run_date = X AND name = Y
命令,然后插入新行。
表读取的方式是我通常只使用valid = 1
行,但我不能丢弃无效行。显然,这个模式也没有主键。
是否有更好的方法来构建此数据或有效位,以便我可以加快插入和搜索的速度?不同列的列上的一堆索引变大。
答案 0 :(得分:0)
在下面的所有建议中,摆脱valid
及其UPDATE
。这不可扩展。
计划A:在SELECT
时间,使用'groupwise max'代码查找最新的run_date
,从而找到“有效”条目。
计划B:有两个表并在插入时更改两者:history
,PRIMARY KEY(name, run_date)
和简单的INSERT
声明; current
,PRIMARY KEY(name)
和INSERT ... ON DUPLICATE KEY UPDATE
。 “通常”SELECTs
只需触摸current
。
另一个问题:TIME
仅限于838:59:59
,旨在表示“一天中的时间”,而不是“已用时间”。对于后者,请使用INT UNSIGNED
(或INT
的某些变体)。对于格式设置,您可以使用sec_to_time()
。例如sec_to_time(3601)
- > 01:00:05
。