MyISAM 如何比 InnoDB“更快”,如果
我最近发现 MySQL 有一个我不知道的“内存”引擎(我的大部分数据库工作都是针对业余项目的,所以我边走边学习我需要的东西)。似乎这个选项应该让我大大提高性能,所以我想知道它是否有任何缺点。我所知道的两个是:
我相信 #1 不应该是一个问题,因为我使用的是 AWS EC2,并且可以根据需要移动到具有更多内存的实例类型。我相信我可以通过根据需要转储回磁盘来缓解 #2。
还有哪些问题?内存引擎能否提供比 MyISAM 或 InnoDB 更差的性能?我想我读过一些关于这个引擎的索引不同的东西;这是我需要担心的事情吗?
在 mongoDB3 中出现了一个新的存储引擎:WiredTiger。然而,MMAPv1仍然是 Mongo 的默认选择。
一个可能并不比另一个更好,这通常是用例和为工作选择正确工具的问题。但是哪种发动机适合什么工作?
事实上,虽然 MMAPv1 是默认引擎,但WiredTiger 似乎在几乎所有领域都更好。它具有与 MMAPv1 相同的功能以及:
我在MongoDB 的博客上找到了一个比较表:
所以除非你在 Solaris 上,否则有理由不选择 WiredTiger 吗?
编辑
这里有两个视频详细解释了WiredTiger和MMAPv1的内部 结构。
我有一个 mysql 5.1 服务器,其中包含大约 450 个表的数据库,占用 4GB 。这些表中的绝大多数(除了 2 个)都是 MyIsam。这在大多数情况下都很好(不需要事务),但是应用程序一直在增加流量,并且某些表由于更新时的表锁定而受到影响。这就是现在有 2 个表是 InnoDB 的原因。
较小表(100k 行)上的转换根本不需要很长时间,从而导致最少的停机时间。然而,我的一些跟踪表接近 5000 万行。有没有办法ALTER TABLE...ENGINE InnoDB在大桌子上加速?如果没有,是否有其他方法可以最大限度地减少这些写入繁重表的停机时间?
所以今天一位教授告诉我们,当数据库必须进行更新时,在内部(在低级别)它会进行删除,然后使用更新的字段进行插入。然后他说这是跨所有数据库制作的,然后我开始讨论,说我认为这没有意义,但我没有足够的资源来支持我的立场。他似乎知道很多,但我不明白为什么 dbs 会这样做。
我的意思是,我知道如果您更新一个字段并且该行需要更多空间,那么它可能会物理删除该行并将其放在新数据的末尾。但是,如果例如您减少了使用的空间,为什么它会在最后删除并重新插入呢?
这是真的吗?有什么好处?
我继续在许多论坛和许多博客上看到一个页面的组成如下所示: 页面大小:16 x 512B = 8192B 页眉:= 96B 最大 In_Row 行:= 8060B
这留下 (8192 - 96 - 8060)B = 36B。
好的,这是合乎逻辑且正确的。我的问题是:为什么那么多人说剩下的36B是留给slot array的?
显然,插槽数组在页面上每行给出 2B;所以,它可以小到 2B,大到 1472B:
2B:1 行 * 2B = 2B
1472B:8096B = n*9B(带开销的最小行大小……想想单个 TINYINT 列)+ n*2B(每行槽阵列成本)=> 8096 = 11n => n = 8096 / 11 = 736。
736*2B = 1472B。
由于 14B 版本标签,这使我达到 20。
USE master ;
GO
CREATE DATABASE test ;
GO
USE test ;
GO
ALTER DATABASE test
SET ALLOW_SNAPSHOT_ISOLATION ON ;
GO
ALTER DATABASE test …Run Code Online (Sandbox Code Playgroud) sql-server-2008 storage-engine data-pages database-internals
标题说明了一切。奇怪的是找不到这方面的结果。
我将MEMORY Engine用于与特定 MYSQL 查询关联的所有表,因为访问速度对我的项目至关重要。
出于某种原因,我注意到仍然会发生大量磁盘写入。
这是因为 Windows 将 RAM 交换到磁盘吗?我怎样才能防止这种情况发生?
编辑:这是我的全局变量:
mysql> show global variables;
+---------------------------------------------------+--------------------------------------------------------------------------------
------------------------------+
| Variable_name | Value
|
+---------------------------------------------------+--------------------------------------------------------------------------------
------------------------------+
| auto_increment_increment | 1
|
| auto_increment_offset | 1
|
| autocommit | ON
|
| automatic_sp_privileges | ON
|
| back_log | 50
|
| basedir | C:/Program Files/MySQL/MySQL Server 5.5/
|
| big_tables | OFF
|
| binlog_cache_size | 32768
|
| binlog_direct_non_transactional_updates | OFF
|
| binlog_format | STATEMENT
|
| …Run Code Online (Sandbox Code Playgroud) 我正在阅读 Itzik 的书“查询 Microsoft SQL Server 2012”以及在互联网上阅读/观看不同的教育材料。我的目的是对数据库内部的工作方式有一个有用的理解。
我有点怀疑我无法解决 IAM 页面。由于我处于我理解的早期阶段,我可能需要那些对它有更好了解的人的额外帮助,所以如果我的怀疑看起来很荒谬,请原谅我。
在第 15 章“实施索引和统计”中出现了一个图像 - 如下所示 - 作为 IAM 页面的示例:

您可以通过红色箭头看到与相同程度相关的 16 页。这怎么可能?这是作者/编辑的错误吗?或者更有可能的是:有什么我没有正确理解的吗?
我的另一个问题与页面间隔有关。为什么它们不相邻?以最后一个extent为例,它将覆盖id为336到22642的页面,或者前一个,296到328的页面。
storage-engine ×10
mysql ×5
innodb ×2
memory ×2
myisam ×2
amazon-rds ×1
aws ×1
data-pages ×1
mongodb ×1
mongodb-3.0 ×1
mysql-5 ×1
sql-server ×1
update ×1