我想让我的表架构更好。此表将每微秒插入一条记录。
表格已经太大了,所以我无法测试表格本身。
当前设置(列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 更快。
过早优化是万恶之源。
如果你有固定数量的整数,或者至少有一个合理的上限,请坚持为每个整数设置一个单独的列。
然后,您将在 alk 列上使用组合索引,理想情况下,首先使用不可为空和选择性的列。
如果要优化,请使用仅占用两个字节的smallint
。
如果我将三个整数列更改为一个 varchar 列,SQL 的运行速度会比现在快吗?
不明显。 您可能会对性能产生一些小的影响,平衡以下因素:
- 字符串列是大于还是小于整数键(导致数据页和索引略大或变小)? 两个可变长度字符串
- 上的索引是否比可变长度字符串和三个固定长度键上的索引效率低?
- 结果是否与您需要的匹配,或者获取记录后是否需要进行其他处理?
无论哪种情况,可用索引都将用于查找与条件匹配的行。 这是一个索引搜索,因为比较都是相等的。 然后,Postgres 将直接转到您需要的行。 除了指数比较之外,还有很多工作要做。
你描述的是每秒1,000,000次插入或每天8400万次插入 - 这是很多。 在这种情况下,您不会使用笔记本电脑上运行的现成的 Postgres 实例。 你应该有适当的DBA支持来回答这样的问题。