一种说法是这样的:
LSI - 允许您对单个 Hash-Key 执行查询,同时使用多个不同的属性来“过滤”或限制查询。
GSI - 允许您对表中的多个 Hash-Key 执行查询,但因此会增加吞吐量。
下面对表格类型及其工作方式进行了更广泛的细分:
仅哈希
你可能已经知道了; Hash-Key 本身必须是唯一的,因为写入已经存在的 Hash-Key 会覆盖现有数据。
哈希+范围
Hash-Key + Range-Key 允许您拥有多个相同的 Hash Key,只要它们具有不同的范围键即可。在这种情况下,如果您写入已存在的 Hash-Key,但使用该 Hash-Key 尚未使用的 Range-Key,则会创建一个新项目,而如果项目具有相同的 Hash+Range 组合已经存在,它会覆盖匹配项。
另一种思考方式是像具有格式的文件。您可以在同一个文件夹(表)中拥有与另一个文件同名(哈希)的文件,只要它们的格式(范围)不同。同样,您可以拥有多个相同格式的文件,只要它们的名称不同即可。
大规模集成电路
LSI 与 Hash-Key + Range-Key 基本相同,并且在创建项目时遵循与它相同的规则,不同之处在于您还必须为 LSI 提供值;它们不能为空/null。
说 LSI 是“Range-Key 2”并不完全正确,因为您不能拥有(使用我之前的文件和格式类比)名为:file.format.lsi 和 file.format.lsi2 的文件。但是,您可以使用 file.format.lsi 和 file.format2.lsi 或 file.format.lsi 和 file2.format.lsi。
基本上,LSI 只是一个“Filter-key”,而不是实际的 Range-Key;您的基本 Hash 和 Range 值组合必须仍然是唯一的,而 LSI 值根本不必是唯一的。一种更简单的看待它的方法可能是将 LSI 视为文件中的数据。您可以编写代码来查找所有名称为“PROJECT101”的文件,无论它们的fileFormat 是什么,然后读取其中的数据以确定查询中应包含哪些内容以及省略哪些内容。这基本上就是 LSI 的工作原理(只是没有打开文件以读取其内容的额外开销)。
GSI
对于 GSI,您实际上是在为每个 GSI 创建另一个表,但无需维护多个在它们之间镜像数据的单独表;这就是它们花费更多吞吐量的原因。
因此,对于 GSI,您可以指定 fileName 作为您的基本 Hash-Key,并指定 fileFormat 作为您的基本 Range-Key。然后,您可以指定具有 fileName2 的哈希键和 fileFormat2 的范围键的 GSI。然后,您可以根据需要查询fileName 或fileName2,这与LSI 不同,您只能查询fileName。
主要优点是您只需要维护一个表,而不是 2 个,并且每当您写入主哈希/范围或 GSI 哈希/范围时,其他(多个)将自动更新同样,因此您不能像使用多表设置一样“忘记”更新其他表。此外,在更新一个之后再更新另一个之前,也不会丢失连接,就像多表设置一样。
此外,GSI 可以“重叠”基本 Hash/Range 组合。因此,如果您想创建一个表,其中 fileName 和 fileFormat 作为您的基本哈希/范围,filePriority 和 fileName 作为您的 GSI,您可以。
最后,GSI Hash+Range 组合不必是唯一的,而基本 Hash+Range 组合必须是唯一的。这在双/多表设置中是不可能的,但在 GSI 中是不可能的。因此,您必须在更新时同时提供基础和 GSI 哈希+范围的值;这些值都不能为空/null。