我应该如何优化这个表的存储?

Inc*_*ito 7 mysql optimization

我正在使用 MySql 来存储这种格式的基本表:

    id      int(11)          //Auto-Incrementing ID
    data    varchar(5120)    //Random input data, compressed by a program, not mysql.
    -----------------------
    Row size ø  916 B
Run Code Online (Sandbox Code Playgroud)

这有点令人不安,因为现在我每个月大约有 5,000 条记录,我想对其进行优化,而不是最终平均为 1mb/1000 条记录。

我以这种方式设置它最初是因为我希望能够捕获更大的集合,但它们非常罕见,正如您在此图表中看到的那样:

在此处输入图片说明

链接到图形 API

count   n*128 bytes
+-------+----------
1       28
1       26
1       24
2       22
8       21
4       20
13      19
12      18
16      17
27      16
43      15
58      14
69      13
114     12
184     11
262     10
399     9
588     8
807     7
1224    6
1245    5
546     4
73      3
9       2
6       1
1       0
Run Code Online (Sandbox Code Playgroud)

我在这里主要关心的是我浪费了多少空间来容纳该图表的尾部,当我最终得到更大的异常值时会发生什么?当大约 80% 的数据非常适合 varchar 1024 块时,我将不得不再次增加我的行大小,这是我现在使用的大小的 1/5。

那么我应该如何首先构建这个东西?

Rol*_*DBA 4

既然它已经建成了,让我们看看你有什么。有一种有趣的方法可以为当前存在的数据规划列定义。如果表名称是 mydata,请尝试运行以下查询:

从 mydata 中选择数据过程分析();

这不会显示您的任何数据。这将检查列data本身,根据前 256 个不同值计算统计信息(默认情况下,您可以指定不同值计数)并推荐表应具有的正确列类型。

只要表是 MyISAM,就不必太担心行大小,因为默认行格式是 DYNAMIC。如果表是 InnoDB(我当然希望不是),请确保数据不是主键的一部分。您的聚集索引将像在您的后院倒入未稀释的 MiracleGro 一样增长。

您可能需要将数据列分解为 128 个块,并运行 MD5(32 个字符输出)或 SHA1(40 个字符输出),然后连接这些 MD5 或 SHA1 输出并存储它们。这将节省 75% 的存储空间。尝试编写分手代码,享受乐趣。这只是我脑海中冒出的一个漫无目的的建议。

您可能还想考虑使用 Sphinx 索引。