三个字段上的索引/键或另一列中的concat()字段

时间:2013-08-02 03:23:13

标签: php mysql indexing primary-key concat

我的社区网站将通过注册表格向居民进行注册,该注册表格将包含三个阻止,楼层编号和门号的列表框。

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

我的第二个问题是:如果我要进行连接路由,是否在发送到数据库之前连接它们(在处理php中)或者如果我将表中的列设置为使得表中的三个值并执行了concat?

修改

根据回复,一点点解释可能会增加价值:

我的表格/表格仅供会员提出意见和建议。查询表可能是:

  1. 由会员检查他们的投诉状态。每天可能会有20个这样的电话 - 很少超过这个。
  2. 由管理员从管理页面呼叫报告 - 这可能是未答复的投诉,已解决的投诉,发送感谢信息以获取建议等。这也可能意味着每个区块都会收到未解决的投诉等。
  3. 当管理员回应该成员时,这将调用记录的更新。
  4. 发送新投诉或建议的成员。
  5. 因此,实际上,查询可以是单个公寓号码或块名称。我已经有一个检查投诉状态表单,它单独使用三列,这不是问题,因为它涉及检索单个记录。例如,如果在B区块报告中有30条记录出现怎么办?还是一百?在这种情况下,检索的连接是一个问题吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

这不会减慢任何事情。

另一方面,如果您不需要查询或更新这些单独的字段,并且您将始终只处理apartment_number ...那么您可以为apartment_number创建一个列。

如果您需要从apartment_number解析各个字段,性能会变慢。例如,如果您需要检索门号组件是偶数的行,或者楼层号大于1的行......那就是事情会变慢的时候。

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