我目前正在使用 information_schema.TABLES 来计算按数据库名称分组的总磁盘空间使用量,但它的运行速度非常慢。在拥有数百个数据库的服务器上,计算可能需要几分钟时间。
按数据库计算磁盘空间使用量的最快方法是什么?我应该只看文件系统吗?有没有加快信息模式的方法?
我目前正在使用 information_schema.TABLES 来计算按数据库名称分组的总磁盘空间使用量,但它的运行速度非常慢。在拥有数百个数据库的服务器上,计算可能需要几分钟时间。
按数据库计算磁盘空间使用量的最快方法是什么?我应该只看文件系统吗?有没有加快信息模式的方法?
我正在开发一个数据库来存储“时间序列”数据(此时 X 的值为 Y)。行本身非常小且大小固定,主键由两个 smallint 列、1 个 tinyint 列和 1 个 timestamp 列组成。每行的索引长度使用率非常低(大约 12 个字节),但是数据库将用于存储非常大量的数据。
所以问题是服务器最终将拥有比 MySQL 中该表的 index_length 大小更少的物理 RAM。发生这种情况意味着什么?我知道理论上 Linux 可以将内存交换到磁盘,但这是否会重复磁盘使用(因为已经存在一个 .MYI 文件)?无法将整个索引存储在 RAM 中对性能有何影响?对于 RAID 1 中的 SATA II 驱动器,我还能期望低于 10 毫秒的选择吗?
回应第一条评论以获取更多信息
目前我的问题是理论性的而不是实践性的。我正在从事的项目资金充足,从技术上讲我们可以负担 RAM 成本,但我更想知道没有足够的 RAM 来覆盖索引的影响。但无论如何,我还是会尝试回答。
从技术上讲,该项目具有无限 RAM,因此减少它的唯一原因是降低成本。
数据存储在 MyISAM 表中用于“历史”存储目的,但在前 24 小时左右存在于 NDBCluster 中(NDB Cluster 使用的索引 RAM 是 MyISAM 的大约 4 倍)。
我当然可以升级 RAM,但这样做会增加很多复杂性。
索引的MB使用量的答案是2.29MB,但毫无意义。现在我只是在测试数据结构的索引使用情况。2.29MB 包含 155,301 行(每行约 15.5 字节)。
...
所以我真正关心的只有一张桌子。其余的都非常小。表的结构如下:
CREATE TABLE IF NOT EXISTS `monitor`.`result` (
`server` SMALLINT UNSIGNED NOT NULL ,
`ref_id` SMALLINT UNSIGNED NOT NULL ,
`request` TINYINT UNSIGNED NOT NULL ,
`recorded` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`resolution` TINYINT NOT NULL ,
`value` MEDIUMINT UNSIGNED NOT NULL ,
PRIMARY KEY (`server`, `request`, `recorded`, `ref_id`) )
ENGINE = MyISAM
“ref_id”列存在的原因是为了缩小数据集所指的范围,使其超出服务器级别。因此,例如,我们可能拥有有关服务器上用户或设备的统计信息。
为什么我需要这么多内存
上表似乎不会使用那么多 RAM,而且在大多数实际情况下,它不会。我想存储尽可能多的数据。我知道我可以存储更少的数据,但我希望数据的分辨率尽可能高。磁盘空间很便宜,所以我什至不关心这个成本,但另一方面 RAM 可能会变得昂贵。尽管商业模式使得不必在任何程度上担心 RAM 成为可能,但我还是希望尽可能降低成本。
换句话说,我想为每个受监控的服务器每分钟最多存储 100 个统计信息。您可以看到在一千台服务器中行数迅速变大(100×1000×1044×365 = 38,106,000,000)。一千台服务器每年的预算是 120,000 美元(大量 RAM),但关键是要降低成本。
细化问题
我非常感谢到目前为止提供的答案,所以我会更具体一些,以更具体地解决我的问题。
到目前为止的答案让我认为我需要自己简单地做一些基准测试,看看会产生什么结果(为你开发!)。所以在这一点上,我真正面临的“问题”是 RAM 使用量将不可避免地达到数百 GB。
问题 1 ) 因此,如果我决定采用将大量数据放入 RAM 的方法,则需要将其分布在一堆服务器上。我已经使用 NDBCluster 执行此操作,但 NDBCluster 使用几乎 3 倍的 RAM 来存储相同的数据(15 字节对大约 48 字节)。在服务器集群的 RAM 中存储那么多数据的公认方法是什么?我应该实施一些应用程序级系统来与一堆 MyISAM 服务器集成吗?
问题 2)MyISAM 是数据库引擎的正确选择吗?我用 InnoDB 测试了一下,它似乎比 MyISAM 使用更多的 RAM 来处理索引。非 MySQL 解决方案呢?
问题 3 ) 将索引存储在磁盘上是否值得?那时我什至不应该创建一个索引,如果它无论如何都不会在 RAM 中(我非常怀疑)。
问题 4 ) 如果我选择不将数据放入 RAM 的方式,该项目推荐使用哪种磁盘设置?SSD 的 RAID?
问题 5 ) 不在索引中包含值和分辨率列是否值得?假设索引在磁盘上而不是在 RAM 中,我们在谈论浪费多少 CPU 时间?
非常感谢您的任何建议,一旦回答了这些问题(如果可能),我一定会选择一个答案