我正在创建存储在 MySQL 中的大量位板存档。在我的模式中,有四组链接的位板——为了查询——在四个不同的表中表示。四组中的每一组将有大约 100k 行,我预计这些组中大约有 35k。
我的问题是关于 SQL 服务器本身的性能影响和限制。我考虑了以下模型:
- 35k 个数据库,每个有四个表,每个表 100k 行
- 1 个数据库,每组四个命名表,例如 db948-a、db948-b、db948-c、db948-d
附加信息:
- 这些表之间没有任何联系;他们不需要在任何时候加入。
- 它们不需要在任何时候更新(对四个表中的每一个都进行一次 INSERT),从那时起只需要 SELECT。
- 这将存储在 ReiserFS(或没有文件计数问题的类似 FS)上
- 我希望使用 MyISAM(不需要事务支持)
所以我主要关心的是 MySQL 对表和数据库计数的限制——鉴于上述信息,我是否会超过任何限制,从而取消其中一种模式的资格?
此外,35k 个不同的数据库或一个数据库中的 140k 个表是否会引起任何明显的性能问题?
谢谢!
让我们从多个角度来看
观点 #1:针对 MyISAM 表的选择
如果您只执行 SELECT,则需要运行此查询:
这将为 MyISAM 密钥缓存推荐正确的大小。32 位的最大容量为 4GB。你可以在 64 位机器上走得更高。但是,请根据 DB 服务器拥有的 RAM 量使用常识。这应该是您关心的问题,因为只有来自 .MYI 的页面被缓存。.MYD 中的任何内容都必须一遍又一遍地从磁盘读取。
如果从这个查询中推荐的 RAM 数量远远超过安装的 RAM 数量数量级,只需将 key_buffer_size 设置为 4G 并在这个角度上收工。
观点 #2:为 MyISAM 表利用不同的行格式
将 MyISAM 表更改为使用 FIXED 行格式可以提高 SELECT 的整体性能。为什么 ?
由于 CHAR 字段由于字段宽度固定而需要较少的字符串操作,因此针对 CHAR 字段的索引查找平均比 VARCHAR 字段快 20%。这不是我的任何猜测。
MySQL Database Design and Tuning一书在 MyISAM 表上做了一些奇妙的事情来证明这一点。书中的例子做了如下的事情:
该指令强制 VARCHAR 分配固定数量的空间,就像 CHAR 一样。早在 2007 年,我在上一份工作中就做到了这一点,并使用了 300GB 的表并将索引查找速度提高了 20%。
当然,通过将 ROW_FORMAT 更改为 FIXED,在最坏的情况下,MyISAM 表的大小将增加一倍。如果您选择这样做,请确保您有足够的磁盘空间。
观点#3:从 mysqld 的有利位置限制打开文件的数量。
每次启动 mysqld 时,都会根据 /etc/my.cnf 设置许多变量。罕见的例外是选项open_files_limit。如果 my.cnf 没有此设置,mysqld 将尝试计算此选项的最佳数量,以便 mysqld 仍然可以运行并将任何文件句柄留给操作系统。
您可以将这个数字设置得更高,风险自负。
观点#4:磁盘注意事项
由于您选择的存储引擎是 MyISAM,因此您必须拥有快速读取磁盘,因为从不缓存数据页。请使用 RAID10 套件。它们比其他设置更容易进行磁盘维护。您也可以使用 SSD 驱动器。无论您选择什么,都要为老化磁盘和定期磁盘维护做好准备。确保您的 RAID 卡具有最新的固件升级。
概括
您提供的所有信息都必须从这四个角度进行检查。您必须取得良好的平衡,并且可能必须根据预算、可用硬件、磁盘空间量以及您未预料到的 MyISAM 的总体限制对您的选择做出让步。
你考虑过混合物吗?你在这里处于两个极端。我建议在中间的某个地方见面。280 个数据库,每个数据库有 500 个表,或者类似的细分?这里的优势是,如果您需要分片/分裂/联合或现在很酷的孩子们所说的任何东西,您可以轻松地一次性移动大量数据库。这也使您远离每个极端的管理问题。备份具有 140K 表的数据库,或备份 35K 数据库,不会很有趣。但介于两者之间的某个地方可能是可控的。