我有一个数据库,其中大多数表都有表的删除标志。因此系统软删除项目(因此除非由管理员提供,否则它们不再可访问)
让我担心的是,几年后,当表格大得多时,系统的整体速度将会降低。
我可以做些什么来抵消这样的效果。
我会感谢所有建议或故事。
更新
所以分区似乎是关键。但不会分区只创建两个“表”,一个包含已删除的项目,另一个没有已删除的项目。
因此,随着时间的推移,删除的分区将变大,偶尔从中获取的分区将变慢(并且随着时间的推移变慢)
速度差异是我应该担心的吗?因为我通过某个键值获取大部分(如果不是全部)数据(有些是搜索但是对于此设置来说它们可能很慢)
答案 0 :(得分:4)
我在DELETE
标志上对表进行分区。
已删除的行将实际保存在其他位置,但从SQL
的角度来看,该表保持不变。
答案 1 :(得分:4)
哦,是的,请删除删除字段。你会一直在反对它,对吧?与您经常查询的其他字段(如父ID)的复合索引也可能是一个好主意。
答案 2 :(得分:1)
可以说,当且仅当性能问题真正出现时,才能做出这个决定。它在很大程度上取决于以什么速率添加多少行,您的盒子规格等。显然,您的应用程序中的抽象级别(以及您正在使用的任何库的限制)将有助于确定这样的更改将有多困难
如果它成为问题,或者您确定它会成为问题,则首先在两个表之间对已删除标志进行分区,一个表保存当前数据,另一个表保存历史/已删除数据。如上所述,“删除”数据仅供管理员使用,可以合理地假设(在大多数应用程序中)用户总数(此处仅限于管理员)不足以导致问题。这意味着您的管理员在搜索特定表时可能需要等待一段时间,但您的用户群(在大多数应用程序中可能更重要)将经历更少的延迟。如果管理员的性能变得不可接受,您可能希望索引访问已删除记录的user_id(或transaction_id或其他)字段(我通常索引我访问该表的每个字段,但在某种程度上可以进行交易-offs关于哪些索引最值得)。
根据数据的访问方式,您可以采用其他简单的技巧。如果管理员大部分时间都在寻找特定记录(而不是读取用户活动的“历史记录”或“日志记录”),那么人们通常会认为比旧记录更频繁地查看记录。记录。有些数据库包含调优选项,可以比旧记录更容易找到最近的记录,但您必须查找特定数据库。如果做不到这一点,你可以手动完成。最简单的方法是使用一个包含所有 n 天,几周或几个月的记录的ancient_history表,具体取决于您的约束和可疑的使用模式。然后,较新的数据存在于一个小得多的表中。即使管理员要“浏览”所有记录而不是搜索特定记录,您也可以先显示第一个 n 天,并有一个链接,看看他们找不到的所有日子他们正在寻找(例如,大多数网上银行应用程序,让您浏览交易,但只显示历史的前30天,除非您另有要求。)
希望您可以避免必须更进一步,并在user_id或某些此类方案上进行分片。根据应用程序其余部分的规模,您可能必须执行此操作。除非您肯定需要,否则我强烈建议您首先使用垂直分区(例如,将您的forum_posts保留在与sales_records不同的机器上),因为它更易于设置和维护。如果您最终需要在user_id上进行分片,我建议使用谷歌; - ]
祝你好运。顺便说一句,我不是一名DBA,所以请耐心等待。