我想将一个数字列表和一些其他字段存储到MySQL中。列表中的元素数量是动态的(有时它可以容纳大约60个元素)
目前我正在将列表存储到varchar类型的列中,并完成以下操作。
e.g. aList = [1234122433,1352435632,2346433334,1234122464]
在存储时,aList被转换为字符串,如下所示
aListStr = str(aList)
并在读取时将字符串转换回列表,如下所示。
aList = eval(aListStr)
大约有1000万行,由于我将其存储为字符串,因此占用了大量空间。最有效的方法是什么?
还有什么应该是存储字符串列表而不是数字的有效方法?
答案 0 :(得分:2)
由于您希望存储整数,因此有效的方法是将它们存储在INT / DECIMAL列中。
创建一个附加表来保存这些数字,并添加一个ID列以将记录与其他表相关联。
还有什么应该是有效的方式 用于存储字符串列表而不是 号码?
除了我所说的,你可以将它们转换成非常简单的HEX代码。占用更少的空间。
请注意,大型VARCHAR可能会严重影响性能。 VARCHAR(2)和VARCHAR(50)在完成sotring等操作时很重要,因为MySQL会根据VARCHAR最大大小为它们分配固定大小的内存片段。 当这些切片太大而无法存储在内存中时,MySQL会将它们存储在磁盘上。
答案 1 :(得分:1)
MySQL也有SET类型,它的工作方式与ENUM类似但可以容纳多个项目。 当然,你必须有一个有限的列表,目前MySQL只支持多达64个不同的项目。
答案 2 :(得分:0)
我不太担心存储空间,更担心记录检索,即可索引性/搜索。
例如,我想在WHERE子句中执行LIKE或REGEXP来查找列表中的单个项目比将每个列表项规范化为单独表中的行要贵得多。
但是,如果您再也不需要在这些列中再次执行此类查询,那么这无关紧要。
答案 3 :(得分:0)
由于您使用的是关系数据库,因此您应该知道在单个字段中存储非原子值会破坏第一个普通形式。更有可能你应该遵循Don的建议并将这些值保存在相关表格中。我不能肯定地说,因为我不知道你的问题领域。很可能为这些数据选择RDBMS是一个糟糕的选择。