如果我有一个充满记录的表,它们可能是付款,预订或其他实体的多种形式,是否有最佳实践来保存每条记录的状态,使其超出简单的0(不活动)和1(活动)?
例如,付款的状态可能为“待处理”,“已完成”或“失败”。我以前做过的方法是在值/文本对中有另一个带有一系列定义的表,即。0 =“失败”,1 =“待处理”和2 =“完成”。然后,我将在付款表中存储0、1或2,并在需要时使用内部联接从定义表中读取文本。
这种方法有时看起来过于复杂和不必要,并且我一直在考虑更改方法,例如直接在付款表的状态字段中直接保存“完成”一词。
这是否被视为不良做法?如果是,最佳做法是什么?
这些似乎是事务记录,因此可能有很多记录,查询性能将成为问题。因此,以这样一种方式组织一个或多个状态列可能很聪明,即对所需记录的复合索引访问将变得简单明了。
在不知道您的查询模式的情况下,很难为您提供清晰的“执行此操作,请勿执行此操作”建议,因此这里有两种情况。
假设您需要获得本月的所有有效预订。您需要查询以下形式
SELECT whatever
FROM xactions
WHERE active = 1 and type = 2 /*bookings*/
AND xaction_date >= CURDATE() - INTERVAL DAY(CURDATE()) DAY
在上使用复合BTREE索引,效果会很好(active,type,xaction_date)
。通过随机访问第一个合格记录的索引,然后顺序扫描,可以满足查询要求。
但是,如果您有type = 2表示有效的预订,而type = 12表示无效的预订,并且您希望本月所有活跃和无效的预订,您的查询将如下所示:
SELECT whatever
FROM xactions
WHERE type IN (2,12)
AND xaction_date >= CURDATE() - INTERVAL DAY(CURDATE()) DAY
由于IN(2,12)
子句需要不相交的值范围,因此将无法如此轻松地扫描复合索引。
tl; dr在MySQL中,为各种状态项索引单独的列更容易,以获得更好的查询性能。但是,如果不了解查询模式就很难知道。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句