- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个非常高的插入率和更新率以及读取率的表。平均每秒插入和更新大约 100 行。每秒大约有 1000 次选择。
该表有大约 1 亿个元组。这是一个关系表,所以它只有大约 5 个字段。三个字段包含键,因此它们被索引。所有字段都是整数。
我正在考虑对数据进行分片,但是,它增加了很多复杂性,但确实提供了速度。另一种选择是使用 innodb。
该数据库在 256GB ssd 的 RAID 1 上运行,具有 32GB 1600mhz 的 RAM 和超频至 4Ghz 的 i7 3770k
数据库在高峰时间不断卡住,其中查询可能高达 200 行被插入或更新,每秒 2500 次选择
你们能指出我应该做什么吗?
最佳答案
分片通常是分配表大小的好主意。负载问题通常应通过复制数据环境来解决。在您的情况下,您的问题是a)巨大的表和b)表级锁定和c)糟糕的硬件。
InnoDB
如果您可以使用表上的一个键作为主键,那么 InnoDB 可能是一个不错的选择,因为他会让您进行行级锁定,这可能会减少您的查询相互等待。一个好的测试可能是将您的表复制到测试服务器并尝试针对他的所有查询,看看性能优势是什么。 InnoDB 的资源消耗率高于 MyISAM,因此请记住这一点。
硬件
对不起,伙计,但您的硬件无法满足您所需的性能。 Twitter 以 2.6k QPS 每秒执行 34 次写入。你不能在做 Twitter 的音量时并认为增强的游戏桌面会减少它。购买带有一些 SSD 驱动器的 15,000 美元的戴尔,您将能够突破 100,000 QPS。你现在正处于大时代。是时候放弃启动设备并为自己准备一台不错的服务器了。你不想分片。升级硬件会更便宜,坦率地说,你需要这样做。
分片
分片非常适合拆分大表。就是这样。
让我把坏事说清楚。 开发分片架构很烂 .你想尽一切可能来不是 分片。升级硬件,购买多台服务器并设置复制,优化你的代码,但看在上帝的份上,不要分片。您远远低于分片的性能线。当你的推力持续 30k+ QPS 时,我们就可以谈分片了。直到那天,NO。
您可以购买具有 16 核 5TB Fusion IO 和 256 GB RAM 的中端服务器(3 万美元 Dell PowerEdge),他将带您一路达到 200k QPS。
但是,如果你拒绝听我的话并且无论如何都要分片,那么这就是你需要做的。
规则 1:保持在同一个分片上(即选择分区规则)
分片后,您不希望跨多个分片访问数据。您需要选择一个分区规则,尽可能将您的查询保持在同一个分片上。在分布式数据环境中分发查询(规则 4)非常痛苦。
规则 2:构建分片映射并复制它
您的代码需要能够访问所有分片。根据你的分区规则创建一个分片映射,让你的代码知道去哪里获取他想要的数据。
规则 3:为分片编写查询包装器
你不想手动决定去哪个分片。写一个为你做的包装器。当你编写代码时,你会感谢自己。
规则 4:自动平衡
您最终需要平衡分片以保持最佳性能。事先为此做好计划并编写代码,目的是让你有一些 kron 工作来平衡你的分片。
规则 4:支持分布式查询
你不可避免地需要打破规则 1。当这种情况发生时,你需要一个查询包装器,它可以从多个分片中提取数据并将其聚合(带入)到一个地方。您拥有的分片越多,就越有可能需要多线程。在我的商店中,我们称之为分布式查询(即在多个分片上运行的查询)。
坏消息:没有用于执行分布式查询和聚合结果的代码。 Apache Hadoop 尝试过,但他很糟糕。 HiveDB 也是如此。一个好的查询分发器很难架构、难以编写、难以优化。这是公司每年要处理的数十亿美元的问题。我不拉屎,但如果你想出一个很好的包装器来跨分片分布查询,支持排序+限制子句并很好地扩展,你可能一夜之间成为百万富翁。卖30万美元?你门外有一英里长的队伍。
我的观点是分片很难而且很昂贵。这需要大量的工作,并且您想尽一切可能不进行分片。如果必须,请遵守规则。
关于mysql - MYISAM 分片与使用 InnoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13887770/
我已经在我的 windows7 机器上安装了 bugzilla4.2.5。当我运行 bugzilla 的 checksetup.pl 脚本时,它显示 Use of uninitialized valu
我正在使用 MySQL 5.1.56 我有一个包含大约 70 个表的数据库,我有一个特定损坏的表的问题,例如表_X 当我尝试访问表时mysql> 从 Table_x 中选择 *;ERROR 1105
我最近尝试将 MySQL 5.1 服务器升级到 5.7。当服务器无法启动时,我发现您必须先导出数据,然后再进行大量升级(二进制文件不再可用),所以我回滚到 5.1 进行导出。 问题是,回到 5.1,I
我正处于项目的开始阶段,到目前为止我一直在使用默认的 MySQL 数据库。 对了,默认的数据库有名字吗? 我的问题是如何在不删除当前表和创建新表的情况下将现有表更改为 utf-8 和 InnoDB。是
我最近尝试将 innodb 缓冲池大小增加到 8GB,但在我的 innodb 状态下,池大小看起来像之前配置的值(在我的例子中是 500MB)。 ---------------------- BUFF
我是一家网络酒店的幸运老板,店主会在不知情的情况下更改设置。当这么说时,我的数据库中有一些表正在使用 InnoDB 引擎运行。但是晚上主机禁用了 InnoDB,所以我无法使用 ALTER 命令将其转换
我刚刚将数据库从 MyISAM 引擎迁移到 InnoDB。我使用 mysqldump 备份我的 MyISAM 数据库,但是当我查看 MySQL docs ,对于 InnoDB 表,我还需要保存二进制文
环境: Windows 7(XAMPP 最新版) Apache 2.4.4PHP 5.5MySQL 5.6.11 我正在尝试从 MySQL 5.1 备份数据库并将其导入 MySQL 5.6。 在 My
我正在创建的应用程序主要使用选择,但也有一些是插入、更新等。我想知道在这些情况下哪种性能最好。 其次,当我在 innodb 中有两个相关的表时,如果它与另一个表中的行相关,我该如何删除它而不吐出错误?
我的意思是页面: https://dev.mysql.com/doc/internals/en/innodb-page-structure.html 这些 16KB 的 MySQL 页面会在内存或磁盘
以下是我使用 mysqldump 备份数据库的开关: /usr/bin/mysqldump -u **** --password=**** --single-transaction --databas
我阅读了本网站上的大部分 InnoDB 示例,但我对 InnoDB 的行为一无所知。 据我所知 START TRANSACTION; 声明这是一个事务连接。没关系到这里。现在我有 3 个表: 带有 I
我有一个包含混合表(MyISAM、InnoDB)的 MySQL 数据库。 如何通过 Linux 命令行使用 mysqldump 创建数据库的完整备份,我应该使用什么选项? 最佳答案 在下面使用- 所有
我有一张桌子:。我用Python在这个表中插入了大约400k行。以下是INSERT语句:。我在两个表tab1.col1和tab2.col2上都有一个索引。但是插入大约需要5分钟/1000行的时间。我从
我正在尝试使用 WAMP 在本地服务器上安装 Magento。 InnoDB 被设置为默认引擎,但它仍然向我显示消息: Database server does not support InnoDB
我最近将所有表从 MyISAM 移到了 InnoDB,因为我想摆脱大表上的表锁定。 在以下表上运行 UPDATE 或 INSERT 查询花费的时间比预期的要多很多。 (约 5 分钟) 我如何优化 in
我正在运行带有 XAMPP 的 Windows 10 和在本地主机上安装的几十个 Drupal 站点。几个月来一切都运行良好。 今天早上,我从两天前的还原点执行了 Windows 还原,以删除不需要的
Socialengine 4.8.6 - 启动时显示“白屏”,只能通过浏览器访问 sesystem.com/phpmyadmin 和 sesystem.com/install。 问题开始:我需要一个包
由于 InnoDB 在 B+ 树中组织其数据。树的高度影响 IO 次数,这可能是 DB 变慢的主要原因之一。 所以我的问题是如何断言或计算B+树的高度(例如根据可以通过行大小、页面大小和行号计算的页数
我尝试使用 mysqldump 从系统 A 使用 innodb 默认存储引擎将大约 40gb 的数据库 db1 转储到 sql 文件中,并尝试在另一个系统 B 上恢复它。两者都有默认存储引擎 inno
我是一名优秀的程序员,十分优秀!