索引完整列或子字符串

时间:2018-05-22 20:29:39

标签: mariadb

我有一个包含数百万行的大型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。

1 个答案:

答案 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计划很糟糕。
  • idPRIMARY KEY吗?这意味着唯一性和PRIMARY KEY(id)的存在。计划C是最好的,但要优化点查询,需要WHERE id >= '404753' AND id <= '40475359999'(或类似的东西)
  • 等。 (如果你给我们一些更多的细节,我可能还有更多要说的。)