MySQL MariaDB InnoDB:将可变宽度的列移动到辅助表上

问题描述 投票:0回答:1

我有一个MariaDB InnoDB表,有几百万行,但只有数字和时间戳组成的固定宽度的短行,我们通常使用现有的任何一列对行进行搜索、过滤和排序。

我们希望添加一列来存储每行相关的 "url"。 理想情况下,每条记录都有它的url.我们知道事实上我们不会通过url列来进行排序,搜索和过滤,我们不介意将url截断到它的前255个字节,所以我们将给它VARCHAR类型。 整个记录将变成可变宽度,在很多情况下,原始记录的宽度将增加一倍。

我们正在考虑使用另一个不同的二级表来存储varchar.我们可以在查询数据时加入它们,或者更有效地--可能--只是获取我们正在显示的页面的url.这种方法是否可取?

这种方法是否可取?是否有更好的选择,也能让我们保持性能?

更新:正如用户Bill Karwin在下面的评论中所指出的,InnoDB并不像MyISAM那样受益于固定宽度,所以这里真正的问题是关于行的大小,而不是固定宽度和可变宽度的讨论。

mysql mariadb denormalization
1个回答
2
投票

假设你可以控制URL的生成方式,你可能想把它改成固定长度的状态。比如Youtube视频的URI。始终为11个字符 和base-64。这就解决了可变长度的问题,避免了连接表。

如果改变URI的生成方式不是一个选项,你有几个选择来使它成为固定长度。

  1. 你可以在空白处填入一个特殊字符来强制数据库中的每一个url都是255,然后在返回之前将其删除。这不是一个干净的解决方案,但使DQL操作比加入更快。
  2. 你可以像你所说的那样获取url,但是要注意,两个http请求可能会比任何其他选项只用一个请求更耗时。
  3. 你可以用另一个表进行连接 只是 当用户需要它时,而不是它是默认的。

考虑到根据你的需求,拥有可变的长度可能不会有那么大的问题。唯一的问题可能是,如果你是 田地面积过大但似乎不是你的情况。

© www.soinside.com 2019 - 2024. All rights reserved.