【问题标题】:What is a better schema for indexing: a combined varchar column or several integer columns?什么是更好的索引模式:组合的 varchar 列或几个整数列?
【发布时间】:2019-05-10 04:42:11
【问题描述】:

我想让我的表架构更好。此表将每微秒插入一条记录。

表格已经太大了,所以我无法测试表格本身。

当前设置(列id、name、one、two、three):

SELECT * 
FROM table
WHERE name = 'foo' 
  AND one = 1 
  AND two = 2 
  AND three = 3;

也许在未来(列id、name、path):

SELECT * 
FROM table
WHERE
    name = 'foo' 
    AND path = '1/2/3';

如果我将三个integer 列更改为一个varchar 列,SQL 会比现在运行得更快吗?

  • 使用 PostgreSQL

  • varchar 长度为 5~12。 我想我可以将bigint 与zerofill(1/2/3 到1000010200003)一起使用,这可能比varchar 更快。

【问题讨论】:

  • 用你给我们的东西可能无法回答这个问题。但是,您可以运行各种速度测试来回答这个问题。确保您正在为要搜索的字段编制索引。
  • Int 比 varchar 快你可以在这里看到答案。stackoverflow.com/questions/2346920/… 但这里有三个 int 字段,如果你将它们更改为一个 varchar 字段,那么速度将取决于 varchar 的大小你声明
  • @ColinMac 实际上,我不是这张桌子的经理。经理告诉我使用他所知道的所有索引。
  • @marc_s 添加了有关它的内容。我只是想知道一个字段可以比三个字段更快。
  • 1 个字段和 3 个字段之间的选择取决于您需要运行的查询类型。如果您只使用字段one、two、three 直接查找,那么组合字符串可能会更快。如果您在任一尾随列上进行查找而没有指定one 中的值(如果需要,还指定two),结果会变慢。在任何一种情况下,选择范围都比较困难,但如果您不总是指定前导范围,则需要对单个列进行更多工作。

标签: sql postgresql indexing


【解决方案1】:

如果我将三个整数列更改为一个 varchar 列,SQL 会比现在运行得更快吗?

不明显。您可能会对性能产生一些小的影响,平衡诸如:

  • 字符串列是大于还是小于整数键(导致数据页和索引边缘更大或更小)?
  • 两个可变长度字符串上的索引是否比可变长度字符串和三个固定长度键上的索引效率低?
  • 结果是否符合您的需要,或者在您获取记录后是否需要额外处理?

在任何一种情况下,可用索引都将用于查找与条件匹配的行。这是一个索引查找,因为比较都是相等的。然后 Postgres 将直接转到您需要的行。除了索引比较之外,还有很多工作要做。

您描述的是每秒 1,000,000 次插入或每天 8400 万次插入 - 这是很多。在这种情况下,您没有使用在笔记本电脑上运行的现成 Postgres 实例。您应该有适当的 DBA 支持来回答这样的问题。

【讨论】:

    【解决方案2】:

    过早的优化是万恶之源。

    如果您有固定数量的整数,或者至少有一个合理的上限,请坚持为每个整数设置单独的列。

    然后,您将在 alk 列上使用组合索引,理想情况下首先使用不可为空和选择性的列。

    如果要优化,请使用smallint,它只占用两个字节。

    【讨论】:

      猜你喜欢
      • 2015-03-16
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多