【问题标题】:Does storing int value as varchar in mysql affect performance heavily?在 mysql 中将 int 值存储为 varchar 会严重影响性能吗?
【发布时间】:2014-10-13 17:09:06
【问题描述】:

我正在开发一个应该是多语言的网站,并且在某些产品中,字段的数量可能比其他产品多(例如,将来产品可能具有旧产品没有的额外功能)。由于这个问题,我决定创建一个产品表,其中包含所有产品都可以具有的公共字段,并且所有语言都相同(如宽度和高度),并添加另外三个表来存储额外的字段,如下所示:

field (id,name)
field_name(field_id,lang_id,name)
field_value(product_id, field_id, lang_id, value)

通过这样做,我可以从一个表中获取所有值,但问题是值可以是不同的类型,例如它可以是数字或文本。我检查了一个开源项目“Drupal”,他们为每种字段类型创建了一个表,通过连接,他们将检索节点数据。我想知道哪种方式对性能的影响更大?为每个额外字段创建一个表,或者将它们的所有值存储在一个表中并通过强制转换即时转换它们的类型?

提前谢谢你

【问题讨论】:

    标签: mysql performance database-design


    【解决方案1】:

    是的,但不是。您将数据存储在实体属性值形式 (EAV) 中。这通常是相当低效的。以下是一些问题:

    • 正如您所写,您无法进行类型检查。
    • 您不能在数据库中设置外键关系。
    • 获取单行的结果需要多个joins 或group by
    • 您不能在特定列上写入索引来加快访问速度。

    一些 变通方法。您可以通过为不同类型设置单独的列来解决打字问题。因此,数据结构将具有:

    • 姓名
    • 类型
    • 值字符串
    • ValueInt
    • 十进制值

    或者你想支持的任何类型。

    如果你想走这条路,还有一些其他的“技巧”。最重要的是对数字进行十进制对齐。因此,您将存储' 1''10',而不是存储'1''10'。这使得值更易于排序。

    当遇到这样的问题时,我经常提倡采用混合方法。这种方法将有一个固定记录,其中所有重要属性都很好地位于具有适当类型和索引的列中——例如:

    • 产品发布日期
    • 产品说明
    • 产品代码

    以及任何最有用的值。然后可以将 EAV 表用于可选的其他属性。这通常平衡了关系数据库处理结构化数据的能力以及 EAV 方法支持可变列的灵活性。

    【讨论】:

    • 完全同意,我还要说 Drupal 肯定不是研究数据库效率的最佳工具(例如,他们在外键属性上使用 varchar 标识符,而 MySQL 使用 varchar 操作真的很慢) .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多