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