Sql 一个表上有很多外键-性能问题
我有一个很大的表,它主要由枚举值组成(40个不同的枚举) 每个枚举值都是单独表的外键,因为我需要允许用户自定义名称并添加/删除新值。 这些枚举表非常小,每个表中最多有20个值 每个外键都被索引,因此总共大约有50个索引键。 这使得插入和更新非常缓慢 主表中大约有200万行,并且一直在增长 表示这些枚举值/提高性能的最佳做法是什么Sql 一个表上有很多外键-性能问题,sql,database,postgresql,indexing,foreign-keys,Sql,Database,Postgresql,Indexing,Foreign Keys,我有一个很大的表,它主要由枚举值组成(40个不同的枚举) 每个枚举值都是单独表的外键,因为我需要允许用户自定义名称并添加/删除新值。 这些枚举表非常小,每个表中最多有20个值 每个外键都被索引,因此总共大约有50个索引键。 这使得插入和更新非常缓慢 主表中大约有200万行,并且一直在增长 表示这些枚举值/提高性能的最佳做法是什么 我应该删除一些在搜索过程中不使用的索引键,只保留外键,还是通过对共享某些“类别”的枚举进行分组,将主表拆分为多个表。这是设计一组表的常用方法 你的fk关系有什么目的?它
我应该删除一些在搜索过程中不使用的索引键,只保留外键,还是通过对共享某些“类别”的枚举进行分组,将主表拆分为多个表。这是设计一组表的常用方法 你的fk关系有什么目的?它们迫使数据库保持一致性,这是很有用的。例如,如果主表中有一列名为
food\u id
,它指向名为food
的六行表中的一行,则fk关系将阻止插入指向第八行的值
但要保证一致性,需要对值进行大量检查。这会使插入和更新变慢。你知道的
我建议您只需将所有外键关系从主表删除到引用表,并删除主表中这些列的索引。可能发生的最坏情况是什么?在指向引用表中不存在的行的其中一列中偶尔会出现一个值。您可以通过以下方式缓解此问题:
SELECT main.item, main.item2, COALESCE (food.name, '--missing--') name
FROM main
LEFT JOIN food on main.food_id = food.food_id
左连接将为缺少的food\u id
值生成空值,COALESCE()
将显示默认值
插入操作将变得很快。请回答您的问题并添加执行计划(使用explain(analyze,buffers)insert…
生成的缓慢插入和更新语句)-而不仅仅是“简单”的解释