AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 13901
Accepted
hexparrot
hexparrot
Asked: 2012-02-25 15:30:56 +0800 CST2012-02-25 15:30:56 +0800 CST 2012-02-25 15:30:56 +0800 CST

MySQL 是否有最大数据库或表数?

  • 772

我正在创建存储在 MySQL 中的大量位板存档。在我的模式中,有四组链接的位板——为了查询——在四个不同的表中表示。四组中的每一组将有大约 100k 行,我预计这些组中大约有 35k。

我的问题是关于 SQL 服务器本身的性能影响和限制。我考虑了以下模型:

  1. 35k 个数据库,每个有四个表,每个表 100k 行
  2. 1 个数据库,每组四个命名表,例如 db948-a、db948-b、db948-c、db948-d

附加信息:

  1. 这些表之间没有任何联系;他们不需要在任何时候加入。
  2. 它们不需要在任何时候更新(对四个表中的每一个都进行一次 INSERT),从那时起只需要 SELECT。
  3. 这将存储在 ReiserFS(或没有文件计数问题的类似 FS)上
  4. 我希望使用 MyISAM(不需要事务支持)

所以我主要关心的是 MySQL 对表和数据库计数的限制——鉴于上述信息,我是否会超过任何限制,从而取消其中一种模式的资格?

此外,35k 个不同的数据库或一个数据库中的 140k 个表是否会引起任何明显的性能问题?

谢谢!

mysql performance
  • 2 2 个回答
  • 3908 Views

2 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2012-02-25T18:12:40+08:002012-02-25T18:12:40+08:00

    让我们从多个角度来看

    观点 #1:针对 MyISAM 表的选择

    如果您只执行 SELECT,则需要运行此查询:

    SELECT CONCAT(ROUND(KBS/POWER(1024,
    IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
    SUBSTR(' KMG',IF(PowerOf1024<0,0,
    IF(PowerOf1024>3,0,PowerOf1024))+1,1))
    recommended_key_buffer_size FROM
    (SELECT LEAST(POWER(2,32),KBS1) KBS
    FROM (SELECT SUM(index_length) KBS1
    FROM information_schema.tables
    WHERE engine='MyISAM' AND
    table_schema NOT IN ('information_schema','mysql')) AA ) A,
    (SELECT 2 PowerOf1024) B;
    

    这将为 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 表上做了一些奇妙的事情来证明这一点。书中的例子做了如下的事情:

    ALTER TABLE tblname ROW_FORMAT=FIXED; 
    

    该指令强制 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 的总体限制对您的选择做出让步。

    • 4
  2. Aaron Bertrand
    2012-02-25T17:09:47+08:002012-02-25T17:09:47+08:00

    你考虑过混合物吗?你在这里处于两个极端。我建议在中间的某个地方见面。280 个数据库,每个数据库有 500 个表,或者类似的细分?这里的优势是,如果您需要分片/分裂/联合或现在很酷的孩子们所说的任何东西,您可以轻松地一次性移动大量数据库。这也使您远离每个极端的管理问题。备份具有 140K 表的数据库,或备份 35K 数据库,不会很有趣。但介于两者之间的某个地方可能是可控的。

    • 2

相关问题

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve