代码之家  ›  专栏  ›  技术社区  ›  Harun Prasad

如何高效地将动态列表存储到MySQL列中?

  •  1
  • Harun Prasad  · 技术社区  · 16 年前

    我想在MySQL中存储一个数字列表和一些其他字段。列表中元素的数量是动态的(有时它可以容纳大约60个元素)

    目前我正在将列表存储到varchar类型的列中,并完成以下操作。

    e.g. aList = [1234122433,1352435632,2346433334,1234122464]
    

    在存储时,aList被隐藏为字符串,如下所示

    aListStr = str(aList)
    

    在读取时,字符串被转换回如下列表。

    aList = eval(aListStr)
    

    大约有1000万行,由于我是作为字符串存储的,所以它占用了很多空间。最有效的方法是什么?

    另外,存储字符串列表而不是数字的有效方法是什么?

    4 回复  |  直到 16 年前
        1
  •  2
  •   Dor    16 年前

    由于您希望存储整数,一种有效的方法是将它们存储在INT/DECIMAL列中。

    创建一个包含这些数字的附加表,并添加一个ID列以将记录与其他表关联。

    还有什么是有效的方法 用于存储字符串列表而不是 数字?

    除了我所说的,您还可以将它们转换为十六进制代码,这将非常简单,占用更少的空间。

    注意,大的VARCHAR可能会对性能产生严重影响。 VARCHAR(2)和VARCHAR(50)在执行SOTRIN操作时很重要,因为MySQL根据VARCHAR最大大小分配固定大小的内存片。 当这些片太大而无法存储在内存中时,MySQL会将它们存储在磁盘上。

        2
  •  1
  •   MindStalker    16 年前

    MySQL还有一个SET类型,它的工作方式类似于ENUM,但可以保存多个项。 当然,您必须有一个有限的列表,目前MySQL最多只支持64个不同的项。

        3
  •  0
  •   Peter Bailey    16 年前

    我不太担心存储空间,而更担心记录检索,即索引/搜索。

    例如,我认为在WHERE子句中执行LIKE或REGEXP来查找列表中的单个项比将每个列表项规范化为单独表中的一行要昂贵得多。

    但是,如果您不需要对这些列执行这样的查询,那么这无关紧要。

        4
  •  0
  •   Victor Olex    16 年前

    因为您使用的是关系数据库,所以您应该知道,在各个字段中存储非原子值甚至会破坏第一个标准格式。更可能的是,您应该遵循Don的建议,并将这些值保存在相关的表中。我不能肯定,因为我不知道你的问题领域。很可能为这些数据选择RDBMS是一个错误的选择。