可能重复:
您能帮助我进行容量规划吗?
我编写了一个使用 MySQL 和 Sphinx 来搜索和存储信息的应用程序。
该应用程序包含一个重达 300GB 的数据库(主要是文本、中等文本和 varchars)。我的 sphinx 索引重达 30GB。
我的问题出现在我计划拥有一个 100GB 左右的数据库而现在我有一个 300GB 的数据库时,它无法加载到内存中(?)。
我正在寻找能够提供最高性能的最佳架构。
我的应用程序首先获得一个查询,然后针对 sphinx 索引运行它,从 sphinx 获取大量 ID,在数据库中查询这些 ID 的几个文本字段,并将结果发送到 .NET 排名器(特殊算法)。
为了获得最佳性能,我为 MySQL 使用了配备 2 个 SSD 磁盘(24GB 内存)的 Xeon i7 W3520 服务器,这并不便宜,而且空间不足,无法添加更多磁盘,所以我需要另一台服务器。
您是否认为如果我使用带有常规磁盘的 mysql 服务器,性能会受到重大影响?我知道我需要快速磁盘来进行 sphinx 搜索(这是我的全文搜索引擎),我使用索引字段(ID)从数据库中选择行,而无需任何复杂的查询,我可能需要在具有足够存储空间的更便宜的服务器上托管数据库。
你能发现我的瓶颈吗?.NET 应用程序主要需要 RAM 和 CPU,DB 需要大量空间和 RAM,而 Sphinx 需要快速磁盘和 RAM。
- 是否可以将 MySQL 索引加载到 RAM 中?
- 我该怎么做才能减轻数据库大小达到 300GB 的事实?
- 磁盘速度较慢的服务器会对性能产生很大影响吗?(如果不花费数百美元购买硬件,我就无法对其进行基准测试)。
- 我使用 Linux 还是 Windows 机器来运行 MySQL 有关系吗?
答案1
我正在寻找能够提供最高性能的最佳架构。
这里的问题是什么?不要误会我的意思,但只有一种方法可以做到这一点 - 将数据库放在您能获得的最快的 SSD 中。
这有意义吗?不知道,但是你要求的不是足够快的场景,而是最高的性能。
我现在有一个 300GB 的,无法加载到内存中(?)。
你知道,这不是真的。按照今天的标准,512GB 的服务器并不算特别大。
磁盘速度较慢的服务器会对性能产生很大影响吗?
当然会。通常,当数据库未加载到 RAM 中时,IOPS(IO 性能)是数据库的限制因素。
您认为如果我使用带有常规磁盘的 mysql 服务器,性能会受到很大影响吗?
定义“常规磁盘”。15k RPM SAS 磁盘阵列对于高性能数据库来说是“常规”的,每个磁盘的 IOPS 大约是常规磁盘的 3-4 倍,但是...对于这样的小型数据库,将其放入 512gb SSD 中,可获得 50,000 IOPS,而不是 15k SAS 驱动器提供的 500 左右。
DB 需要大量空间和 RAM,而 Sphinx 需要快速磁盘和 RAM。
任何不能从 RAM 中填满所有内容的数据库通常都会受到磁盘的限制,主要是因为磁盘非常慢。在大型数据库安装中,获得尽可能快的磁盘子系统是标准做法,但是您的数据库很小,因此简单的 SSD 就足够了。遗憾的是,它的性能仍然比 RAM 低很多。
我该怎么做才能减轻数据库大小达到 300GB 的事实?
意识到这个很小吗?我家里有一个 850gb 的数据库,而我上一个项目是一个 21000gb 的数据库。根据我现在可以访问的一些数据的处理方式,我只会得到 44000gb 高度压缩的数据,我需要处理这些数据。300gb 的“内存”很小。
我使用 Linux 还是 Windows 机器来运行 MySQL 有关系吗?
也许确实如此,但这与这个问题完全无关。Windows 可能有更大的开销(具体取决于配置),但这不会产生任何影响。当您处理这样的系统时,那么残酷地说额外的 128M 开销不会产生任何影响。
答案2
您实际上是否知道您的服务器在做什么?您知道性能瓶颈在哪里吗?如果您没有任何形式的监控和趋势跟踪,那么您就是盲目的。
也许只需为数据添加适当的索引就能对您有所帮助?
可能 IO 确实是你的极限,但也许你有很多空闲的 CPU 周期,并且只压缩保存在数据库中的 blob 就可以增加内存缓存命中率,但代价是动态解压缩,这可能不会被察觉。
我认为在 Linux 下运行 mysql/sphinx 会让你有更好的机会看到和跟踪“内部发生的事情”。