目前,我有一个 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
行,但我无法丢弃无效行。显然,这个模式也没有主键。
有没有更好的方法来构造这些数据或有效位,以便我可以加快插入和搜索速度?不同列顺序上的一堆索引会变得很大。
最佳答案
在下面的所有建议中,去掉valid
及其UPDATE
。这是不可扩展的。
计划 A:在 SELECT
时,使用“groupwise max”代码来定位最新的 run_date
,因此是“有效”条目。
计划 B:有两个表,并在插入时更改两个表:history
,使用 PRIMARY KEY(name, run_date)
和一个简单的 INSERT
陈述; 当前
,带有PRIMARY KEY(name)
和INSERT ... ON DUPLICATE KEY UPDATE
。 “通常的”SELECTs
只需要触摸当前
。
另一个问题:TIME
仅限于 838:59:59
,其含义是“一天中的时间”,而不是“耗时”。对于后者,请使用INT UNSIGNED
(或INT
的某些变体)。对于格式化,您可以使用sec_to_time()
。例如sec_to_time(3601)
-> 01:00:05
。
关于mySQL 有效位 - 替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44458884/