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 条记录。
我以这种方式设置它最初是因为我希望能够捕获更大的集合,但它们非常罕见,正如您在此图表中看到的那样:

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。
那么我应该如何首先构建这个东西?
既然它已经建成了,让我们看看你有什么。有一种有趣的方法可以为当前存在的数据规划列定义。如果表名称是 mydata,请尝试运行以下查询:
从 mydata 中选择数据过程分析();
这不会显示您的任何数据。这将检查列data本身,根据前 256 个不同值计算统计信息(默认情况下,您可以指定不同值计数)并推荐表应具有的正确列类型。
只要表是 MyISAM,就不必太担心行大小,因为默认行格式是 DYNAMIC。如果表是 InnoDB(我当然希望不是),请确保数据不是主键的一部分。您的聚集索引将像在您的后院倒入未稀释的 MiracleGro 一样增长。
您可能需要将数据列分解为 128 个块,并运行 MD5(32 个字符输出)或 SHA1(40 个字符输出),然后连接这些 MD5 或 SHA1 输出并存储它们。这将节省 75% 的存储空间。尝试编写分手代码,享受乐趣。这只是我脑海中冒出的一个漫无目的的建议。
您可能还想考虑使用 Sphinx 索引。
| 归档时间: |
|
| 查看次数: |
291 次 |
| 最近记录: |