“数据库系统基础”,第 3 版。由 Elmasri 和 Navathe 撰写,第 136 页说:
“我们可以根据其中一个字段的值对磁盘上文件的记录进行物理排序 [...]”
这种“物理排序”怎么可能强制执行,尤其是在碎片化方面?大多数数据库使用系统调用将其数据存储在操作系统的文件系统中,只有极少数能够进行原始 i/o。
“数据库系统基础”,第 3 版。由 Elmasri 和 Navathe 撰写,第 136 页说:
“我们可以根据其中一个字段的值对磁盘上文件的记录进行物理排序 [...]”
这种“物理排序”怎么可能强制执行,尤其是在碎片化方面?大多数数据库使用系统调用将其数据存储在操作系统的文件系统中,只有极少数能够进行原始 i/o。
我有一个大小约为 170GB 的数据库,行数介于 20.000 - 700.000.000 行之间(取决于表)。目前我正在使用 MyISAM 存储引擎。
就我而言,查询(读取)速度非常重要,但事务性是可选的。
我的 CRUD 操作估计是:
我管理一个数据库,每天都会创建数千 GB 的无用日志数据。
我无法修复执行所有这些(不必要的)日志记录的软件。有没有办法锁定(或禁用写入)此日志表,使其永远不会被写入,但同时它会报告写入成功,因此不会导致软件出现问题?
我知道我可以用 cronjob 截断表,但我想知道是否有更好的方法?
我在这个线程中遵循了@RolandoMySQLDBA 的提示:mysql,将表从 myisam 更改为 ndb 但我在最后一步没有成功。
我有一个类似的问题,这是我原来的表:
CREATE TABLE `df_modules_metadata_values` (
`id` mediumint(9) NOT NULL AUTO_INCREMENT,
`date_added` datetime NOT NULL,
`date_modified` datetime DEFAULT NULL,
`uid` mediumint(9) NOT NULL,
`share_id` mediumint(9) DEFAULT NULL,
`file_id` mediumint(9) NOT NULL,
`field_id` mediumint(9) NOT NULL,
`val` text CHARACTER SET utf8,
PRIMARY KEY (`id`),
KEY `date_added` (`date_added`),
KEY `uid` (`uid`,`file_id`,`field_id`),
KEY `file_id` (`file_id`,`field_id`),
KEY `uid_2` (`uid`,`field_id`),
KEY `val` (`val`(100)),
KEY `field_id` (`field_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
如果我简单地转换它,它会给我这个错误:
mysql> alter table df_modules_metadata_values engine=ndbcluster;
ERROR 1073 (42000): BLOB column 'val' can't be used in key specification with the used table type
这是我尝试过的:
mysql> show table status where name='df_modules_metadata_values';
+----------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+----------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| df_modules_metadata_values | MyISAM | 10 | Dynamic | 0 | 0 | 0 | 281474976710655 | 2048 | 0 | 1 | 2017-09-10 18:00:21 | 2017-09-10 18:00:21 | NULL | utf8_unicode_ci | NULL | | |
+----------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
1 row in set (0.00 sec)
mysql> alter table df_modules_metadata_values rename df_modules_metadata_values_old;
Query OK, 0 rows affected (0.00 sec)
mysql> create table df_modules_metadata_values select * from df_modules_metadata_values_old where 1=2;
Query OK, 0 rows affected, 1 warning (0.15 sec)
Records: 0 Duplicates: 0 Warnings: 1
mysql> alter table df_modules_metadata_values add column val100 char(100) after val;
Query OK, 0 rows affected, 1 warning (0.39 sec)
Records: 0 Duplicates: 0 Warnings: 1
mysql> alter table df_modules_metadata_values add unique index (val100);
Query OK, 0 rows affected (0.33 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table df_modules_metadata_values engine=ndbcluster;
Query OK, 0 rows affected, 1 warning (0.49 sec)
Records: 0 Duplicates: 0 Warnings: 1
mysql> show table status where name='df_modules_metadata_values';
+----------------------------+------------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-------------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+----------------------------+------------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-------------------+----------+----------------+---------+
| df_modules_metadata_values | ndbcluster | 10 | Dynamic | 0 | 0 | 0 | 0 | 0 | 0 | NULL | NULL | NULL | NULL | latin1_swedish_ci | NULL | partitioned | |
+----------------------------+------------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-------------------+----------+----------------+---------+
1 row in set (0.00 sec)
现在我很难完成你的最后一步,我不明白他们的意思,如何完成“插入”这一步?为什么我们需要这样做?
更何况,在我操作的过程中,我可以看到一些警告,我该如何检查它们?
谢谢!
我已经在 Ubuntu 14.04 中安装了 MongoDB,但我无法将其存储引擎更改为 WiredTiger。
我已在 /etc/mongod.conf 文件中添加了必要的更改,如下所示:
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
engine: wiredTiger
我已经使用以下命令启动了 mongod 进程:
mongod -f /etc/mongod.conf
服务器启动了,但是当我连接到我的 shell 时仍然收到警告:
2017-01-10T15:36:54.866+0530 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
我在这里错过了什么吗?这些更改似乎没有效果。
我目前正在使用 MongoDB 3.2.10,最近听说了新的“inMemory”引擎。经过一番研究,我发现它在 3.2.6 版之后的企业版中可用,但我在社区版中找不到任何关于最终发布的信息。
那么问题来了:他们是否计划发布社区版的 inMemory 引擎?如果他们这样做,我们知道什么时候吗?
如何永久更改MongoDB的存储引擎,这样我就不必每次都指定存储引擎而不必运行mongod ?我在 Windows 7 32 位上使用 shell 版本 3.2.7。我收到一条错误消息:
28663 无法启动服务器。默认存储引擎“wiredTiger”不适用于此 mongod 版本。请明确指定不同的存储引擎,例如--storageEngine=mmapv1.,终止。
还有人知道我完成工作后如何干净地关闭服务器吗?我使用Ctrl+C但它会导致错误,然后我必须清空数据文件夹才能让进程重新开始。
所以今天一位教授告诉我们,当数据库必须进行更新时,在内部(在低级别)它会先删除,然后再插入更新的字段。然后他说这是所有数据库都做的事情,然后我开始讨论说我认为这没有意义,但我没有足够的资源来支持我的立场。他似乎知道很多,但我不明白为什么 dbs 会那样做。
我的意思是,我知道如果您更新一个字段并且您需要更多空间来存储该行,那么它可能会物理删除该行并将其放在新数据的末尾。但是,例如,如果您减少使用的空间,为什么要删除并在最后重新插入呢?
这是真的吗?有什么好处?
在 mongoDB3 中出现了一个新的存储引擎:WiredTiger。然而,MMAPv1仍然是 Mongo 的默认选择。
一个可能并不比另一个更好,这通常是用例和为工作选择正确工具的问题。但是哪个引擎适合什么工作呢?
事实上,虽然 MMAPv1 是默认引擎,但 WiredTiger 似乎在几乎所有领域都更好。它具有与 MMAPv1 相同的功能以及:
我在MongoDB 的博客上找到了一个比较表:
因此,除非您使用 Solaris,否则是否有理由不选择 WiredTiger?
编辑
这里有两个视频详细解释了 WiredTiger和MMAPv1的内部结构。
我知道我们可以在启动 mongod 时将存储引擎配置为实例级别的wiredTiger。
但是我们也可以为不同的集合或数据库选择不同的存储引擎吗?