【发布时间】:2017-01-24 17:00:35
【问题描述】:
我们有一个数据库表,用于存储访问者的浏览器数据,按多个不同的子类型细分。为简单起见,让我们使用下面的表模式。查询基本上将在任何单个 id 列、metric 列、timestamp 列(存储为自纪元以来的秒数)以及 device、browser 或 os 列之一。
我们将对该表进行星型与雪花模式的性能测试(其中所有 id 都进入一个列,但随后添加了一个附加列 id_type 以确定它是哪种类型的标识符),但是只要星型模式(现在就是这样)在雪花性能的 80% 以内,我们就会保留它,因为它会使我们的加载过程更容易。然而,在我这样做之前,我想确保索引在星型架构上进行了优化。
create table browser_data (
id_1 int,
id_2 int,
id_3 int,
id_4 int,
metric varchar(20),
browser varchar(20),
device varchar(20),
os varchar(20),
timestamp bigint
)
最好只在 id 列上创建单独的索引,还是在这些索引中也包括 metric 和 timestamp 列?
【问题讨论】:
-
为每个子类型设置单独的列真的很麻烦吗?对于事实表模式来说,能够维护适当的外键关系似乎是可取的。我意识到 4 字节的标准列最终可能会浪费空间。
-
@GordonLinoff 这不会是世界末日,但它只会使我们获取数据的 ETL 过程更加复杂。这就是为什么只要性能相似,就值得权衡保持流程不变
标签: mysql sql indexing database-performance query-performance