我们假设我有一张表persons
,如下所示:
|id | name | age |
|---|------|-----|
|1 |foo |21 |
|2 |bar |22 |
|3 |baz |23 |
并添加一个新列history
,我存储了一个大的JSON blob,让我们说~4MB。
|id | name | age | history |
|---|------|-----|----------|
|1 |foo |21 |JSON ~ 4MB|
|2 |bar |22 |JSON ~ 4MB|
|3 |baz |23 |JSON ~ 4MB|
这会对整个表格产生负面影响吗?
如下查询:
SELECT name FROM persons WHERE ...
(猜猜:这不会影响表现)SELECT * FROM persons WHERE ...
(猜猜:这会影响性能,因为数据库需要阅读并发送大历史记录条目)是否有其他副作用,如各种不断增长的缓存等可能会降低整体数据库性能?
答案 0 :(得分:1)
JSON属性不会存储在表本身中,而是存储在属于表的 TOAST表中,这是所有超过一定大小的可变长度条目的地方存储(和压缩)。
不读取JSON值的查询根本不会影响性能,因为甚至不会触及TOAST条目。只有当您读取JSON值时,性能才会受到影响,主要是因为从存储中读取的额外数据并传输到客户端,但当然附加数据也将驻留在数据库缓存中并与其他数据竞争。
所以你的猜测是正确的。
答案 1 :(得分:0)
取决于使用此表的事务数量和事务类型(创建,读取,更新,删除)可能会出现性能问题。
如果您要更新历史记录批次,您将进行大量更新事务,这将导致该表重新索引每个更新事务。
假设每次用户登录时都会调用表人员,并且还会更新该用户的历史记录。您正在进行选择和更新,如果这种情况发生很多,将导致大量重建索引,并且可能在用户登录时导致问题而其他用户也在更新历史记录。
更好的选择是为personupdates设置一个单独的表 与人员表的关系。