我们必须将“文件ID”信息存储在数百万行的表中。格式是巴西国家ID的缩写(即:PA代表PARA,BA代表巴伊亚州,SP代表圣保罗,RJ代表里约热内卢,依此类推)和“范围”信息,由简短格式Year(即19)构成。适用于2019年和月份,即“ PA1908”格式。
如前所述,该表有数百万行,每个月我们都必须将其数据与外部数据源进行比较,并且如果外部数据源是我们表的最新更新,则必须替换整个STATE-YEAR-MONTH记录,因此文件ID仅作为查询的where子句中的一个参数存在,以便选择要删除的行。
在第一个建模版本中,我将文件ID分为两列,即使用哈希索引将fileid_state用作Char(2)数据类型,将fileid_scope用作smallint数据类型,但是我不确定这是存档可接受性能的唯一方法,可能正在使用只有第一列名为Char_6且数据类型带有哈希索引的file_id才可以执行。有什么建议是最好的两种方法,或者是另一种存储文件ID的方法,以便选择要尽快删除的行?
请记住,对我来说很难对这些方法进行基准测试,因为有限的硬件中有近10亿行。
最佳答案
Q1:数据类型:首先问问自己,该字符串将如何处理:
您是否需要仅关注“状态”部分? “年度”部分? “月”部分?如果您对其中任何一个回答“是”,则可能应将零件存储在2或3列中。 state CHAR(2) CHARACTER SET ascii
,然后对数字部分使用TINYINT UNSIGNED
或SMALLINT UNSIGNED
。
如果否,只需执行CHAR(6) CHARACTER SET ascii
。如果需要,可以单独使用INDEXed
,也可以将其与“复合”索引中的其他列一起使用。请提供可能需要此索引的UPDATE
和SELECT
语句;我们会批评。
没有“哈希”索引,只有BTree。
“选择要尽快删除的行”-将删除表的百分之几?例如,如果您将DELETE FROM tbl WHERE sym = 'PA1908'
,并且它只是表的一小部分,则INDEX(sym)
可以最佳地工作。
我说“ ascii”是为了避免utf8等所需的空间/处理。
问题2:“然后是我们表的最新更新,必须替换整个STATE-YEAR-MONTH记录”-请详细说明此处发生的情况。
关于mysql - 在MySQL中存储包含2个固定字符和4位数字的数据的性能方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57322874/