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

1 投票
4 回答
3689 浏览
提问于 2025-04-15 17:06

我想把一组数字和其他一些信息存储到MySQL数据库里。这组数字的数量是动态的,有时候可能会有大约60个元素。

目前,我把这组数字存储在一个varchar类型的列里,并且进行了以下操作。

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

在存储的时候,我把这组数字转换成字符串,方法如下:

aListStr = str(aList)

在读取的时候,我又把这个字符串转换回数字列表,方法如下:

aList = eval(aListStr)

现在大约有1000万行数据,因为我把它们存成字符串,所以占用了很多空间。有没有更有效的方法来处理这个问题呢?

另外,如果我想存储一组字符串而不是数字,应该用什么更有效的方法呢?

4 个回答

0

我觉得存储空间不是最重要的,最重要的是怎么快速找到记录,也就是索引和搜索的效率。

举个例子,如果你在查询中用LIKE或者REGEXP来查找列表中的某个特定项,这样的查询会比把每个列表项单独放到一个新表里要耗费更多的资源。

不过,如果你根本不需要对这些列进行这样的查询,那就没关系了。

1

MySQL还有一种叫做SET的类型,它的用法和ENUM类似,但可以存储多个项目。 当然,你得有一个有限的列表,目前MySQL最多只支持64个不同的项目。

2

因为你想存储整数,一个有效的方法是把它们放在INT或DECIMAL类型的列里。

可以创建一个额外的表来存放这些数字,并添加一个ID列,以便把这些记录和其他表关联起来。

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

除了我刚才说的,你还可以把它们转换成十六进制代码,这样会更简单,而且占用的空间也更少。

需要注意的是,使用很大的VARCHAR(可变长度字符串)可能会对性能产生不好的影响。VARCHAR(2)和VARCHAR(50)在执行像存储这样的操作时是有区别的,因为MySQL会根据VARCHAR的最大大小分配固定大小的内存块。如果这些内存块太大,无法存储在内存中,MySQL就会把它们存储在硬盘上。

撰写回答