我想设计一个快速的数据库模式,它可以处理排序和过滤列以及更新条目。
为此,我创建了以下场景:
- 一个事件只有一个名称、状态、最后订阅日期、描述和一个位置
- 活动的可用席位数量与活动一起保存,每次参与者订阅时都会更新
- 每个事件都只有一个类别
- 事件只能按类别列出
- 事件可以按名称、状态或日期过滤(无异或)
- 事件可以按名称、状态或日期(异或)排序
- 这些表必须处理超过 10 个 mio 条目
对于所有测试,我使用 MySQL 和 InnoDB 表。我还尝试尽可能频繁地使用多个插入/更新/删除。通过使用LIKE '%[word]%'完成过滤
首先,我尝试使用 2 个表:一个用于类别,另一个用于事件。索引是类别名称、类别状态名称、类别日期名称和类别日期状态名称。为此,列出、过滤和排序非常快,但插入、更新或删除条目非常慢。我也遇到了锁超时,因为重建索引花费了太多时间。
第二次尝试是有 3 个表:类别、事件和位置。但是如果位置表包含 6 个或更多条目,它也会变慢。我认为是因为快速捕获的索引。添加 100k 个条目大约需要 272 秒。位置的索引是primary-index id和zip-street
下一个尝试是为 last-subscription-date 和计数器创建一个自己的表。但是过滤这个日期或排序这个日期的可能性呢?
最好有 3 个索引,例如:类别名称、类别日期、类别状态,还是我的解决方案有 4 个索引类别名称、类别状态名称、类别日期名称和类别日期状态-为 MySQL命名更好的一个?
我也在考虑字段类型:目前我使用 VARCHAR 作为名称。但也许 CHAR 更好,因为每个条目都具有相同的长度,因此跳转到索引中的特定位置而不是使用可变长度会更快。你怎么看?
有人对如何设计一个支持上述场景的良好和快速的数据库模式有一些建议吗?