我有一个包含数百万行的大型mariadb表。大部分数据分析的基础将在10位数列上,如下所示。
4047535609
6099526199
6014157747
3045308020
对于许多查询,我只需要前6位数字。计划是为这一列编制索引,但我很好奇是否会创建一个子字符串的索引(例如left(sku,6))或者只是索引整个列。我应该注意,大多数查询都涉及对前6位数字进行分组。
高清空间并不是一个真正的问题,但可能有15到2千万行,我对该指数的基数感到好奇。
编辑:我将列名更改为sku而不是id。 id列是主键。 sku列不是唯一的。
id int(11) Primary Key
sku varchar(12)
rate decimal(5,2)
region varchar(24)
quantity int(4)
orderdate datetime
我希望大多数查询都涉及将普通sku与其他类别相关联的分组,例如#st sk at n rate或x region。
答案 0 :(得分:0)
计划A:虚拟列id6
上的索引定义为LEFT(id, 6)
。
计划B:"前缀索引":INDEX(id(6))
- 这在磁盘空间上节俭,但很少有用。
计划C:只需使用INDEX(id)
(或PRIMARY KEY(id)
??)
这个问题缺少很多细节:
"404753"? If so, Plan A, with
找到第一个样本项吗?WHERE id6 =' 404753'可能是最好的。WHERE id between "404700" AND "404987"
? B计划很糟糕。id
是PRIMARY KEY
吗?这意味着唯一性和PRIMARY KEY(id)
的存在。计划C是最好的,但要优化点查询,需要WHERE id >= '404753' AND id <= '40475359999'
(或类似的东西)