对三个字段进行索引/键,或将()字段连接到另一列中


Index/key on three fields or concat() fields into another column

我的社区网站将通过一份登记表接受居民的登记,该登记表将有三个列表框,分别为街区、楼层和门牌号。

我的第一个问题是,由于某些操作需要检索公寓号,将这三个字段存储在三个不同的列中会减慢数据/报告的检索速度吗?在存储连接值的表中添加另一个字段并将其用于检索是否更好?

我的第二个问题是:如果我要走连接路线,那么在发送到数据库之前(在处理php中)连接它们,还是在表中设置列,使其取表中的三个值并执行连接,会有区别吗?

编辑

根据回应,一点解释可能会在这里增加价值:

我的表格是供各位成员提出意见和建议的。查询表可以是:

  1. 由成员检查他们的投诉状态。每天可能有20个这样的电话,很少超过这个数字
  2. 通过管理员从管理页面请求报告,这可能是未答复的投诉、已解决的投诉、发送建议感谢信等。这也可能意味着每个区块都会收到未解决的投诉等
  3. 当管理员回复成员时,他会调用记录更新
  4. 通过会员发送新的投诉或建议

因此,有效地,查询可以通过单个公寓号码或街区名称进行。我已经有一个检查投诉状态表,它分别使用了三列,这不是问题,因为它涉及到单个记录的检索。如果有30条记录会出现在B区报告中,该怎么办?还是一百?在这种情况下,检索的串联会成为一个问题吗?

Q将三个字段存储在三个不同的列中会减慢数据/报告的检索速度吗?

A不,只要数据类型合适,它不会减慢检索速度。(使用INT或VARCHAR,而不是longish CHAR。如果在检索时更容易处理连接的值,那么在检索时进行连接。

SELECT CONCAT(t.block,'|',t.floor_number,'|',t.door_number) AS apartment_number

这不会减缓任何事情。

另一方面,如果您不需要查询或更新这些单独的字段,并且您将始终将其作为apartment_number来处理。。。然后你可以为apartmentnumber创建一个列。

如果您需要解析apartment_number中的各个字段,性能就会下降。例如,如果需要检索门编号组件为偶数的行,或者楼层编号大于1的行……那么速度就会减慢。

我会将它们存储为单独的字段,这样如果需要的话,我就可以访问各个组件。例如,这样我就可以回答这样的问题,比如,3号楼2层有多少门牌?