【问题标题】:What's faster? "explode" or another column?什么更快? “爆炸”或另一列?
【发布时间】:2011-07-18 20:10:08
【问题描述】:

我有一种情况,我需要在我的数据库中存储多个值,但它们大约是。相同的类型,所以现在我不知道将这些值存储为 String 在 MySQL 的 VARCHAR 字段中是否更快,用 commas

1,2,3,4,5

然后在我需要的时候把它们炸掉

$values = explode(",", $stringFromDatabase);

其中 $stringFromDatabaseString 来自 mysql_query + mysql_fetch_array 并用 将它们一一获取$values[0]$values[1]

为每个变量添加另一列(最多 7 行),然后为特定行调用数据库,并使用标准 mysql_query + mysql_fetch_array 程序按列单独获取它们?

那么,用逗号连接一列还是多列?重要的是要注意,我总是需要它们(当然是一个接一个)并且排序并不重要 - 所以我认为 第一个选项 - 是 更好,更快的一个吗?

【问题讨论】:

  • 我也有类似的问题,所以想只在这里发帖。

标签: php mysql explode


【解决方案1】:

最好有多个列。没有多值列是数据库规范化的一部分。

在您的情况下 - 如果您需要从多值 1,2,3,4,5 中选择“3”怎么办?这将是相当具有挑战性的。但是对于多个列,我可以轻松地做到SELECT * FROM Table Where Column3 = 3

【讨论】:

  • 但他说他总是需要每一个值,一个一个。
  • 是的,但是如果他试图查询满足条件的值。
【解决方案2】:

数据库的一般经验法则是列应该是原子的。换句话说,它们应该代表一条信息且仅代表一条信息。将 CSV 列表塞入一列会破坏这一原则,从长远来看会使您的生活更加艰难,尤其是在对您存储的数据进行分析时。我建议每个值有一列是最好的选择。

【讨论】:

  • 除此之外,如果您的列表只是一个逗号分隔的 varchar 字段,则不能在 SQL 中强制执行诸如“一个值只能在列表中出现一次”之类的约束。
  • 或者确实是“此字段应包含数字”之类的约束。谢谢你提醒我那个
【解决方案3】:

为每个值使用单独的列。见1NF

【讨论】:

    【解决方案4】:

    您不应该问“哪个更快”。
    速度并不是唯一需要考虑的因素。 太空火箭确实比你家的汽车快,但你不会坐火箭去商场。
    所以,你应该问“什么方法才是正确的”。
    规范化您的数据库是唯一正确的方法。

    【讨论】:

    • 同意。先把它做好,然后如果你需要让它更快。但是你不会知道你是否需要(或者加速什么,或者你的优化是否会使解决方案出错)直到你有一些真正有效的东西。
    【解决方案5】:

    如何使用类似的东西:

    int AutoId, // 你的主键 int ColumnIndex // 1 表示第 1 列 int ColumnValue // 例如的值对于第 1 列 这不需要用于未使用列的空间,并且有利于查询 选择 ColumIndex, ColumnValue 其中 AutoID = 42 order by ColumnIndex

    【讨论】:

    • 是的,我认为字符串比较慢,因为我相信固定字段长度总是更好。但是,如果您不处理 EB 级的数据,我认为您不会注意到细微的差别 :-)
    猜你喜欢
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    相关资源
    最近更新 更多