bea*_*mit 18 database-recommendation
我正在开发一种产品,作为其操作的一部分,必须跟踪大量文件/目录。这个想法是将统计信息存储在数据库中,然后在启动时为每个文件创建监视。更改的文件将排队(在数据库中)以组同步到远程数据库。它们将按优先级顺序同步,数字介于 1-10 之间。
数据库的相关资料:
我发现了几个我认为可以工作的数据库,但我不确定哪个是最好的:
我认为 NoSQL 数据库将是这里的最佳解决方案,因为没有太多的关系逻辑在进行,并且总数据大小不会太大(例如 < 100 mb,接近 < 30 mb)。我确实看过 SQLite,因为它似乎很简单,可以嵌入到可安装的应用程序中。
由于这是面向最终用户的分布式应用程序而不是高负载服务器,因此数据库不必支持许多并发用户。这里的主要优先事项是找到一个模型最有意义的数据库。
那么问题来了,哪个数据库最适合这种情况?
另外,是否还有其他数据库对这样的应用程序更有意义?
Rol*_*DBA 14
如果你不是那么关心关系逻辑,想要真正快的读取速度,并且你愿意使用 RDBMS,我敢说 MySQL 是有偏见的。为什么 ???
MyISAM 存储引擎有一个选项,可以允许增加表的物理结构以获得更好的性能。那个选项是什么?ALTER TABLE 选项 ROW_FORMAT。
例如,MySQL Database Design and Tuning一书建议在第 72,73 页上使用 ROW_FORMAT=FIXED。这将在内部将所有 VARCHAR 字段转换为 CHAR。它会使 MyISAM 表变大,但对它执行 SELECT 会快得多。我可以亲自证明这一点。我曾经有一个 1.9GB 的表。我使用 ALTER TABLE tblname ROW_FORMAT=FIXED 更改了格式。该表最终为 3.7GB。SELECTs 的速度比它快了 20-25%,而没有改进或改变任何其他东西。
如果您已经有一个用数据填充的 MyISAM 表怎么办?您可以根据 MyISAM 表中的数据获取推荐列定义的指标。什么查询显示这些指标?
SELECT * FROM tblname PROCEDURE ANALYSE();
Run Code Online (Sandbox Code Playgroud)
PROCEDURE ANALYZE () 这不会显示数据。它将读取每一列的值并推荐列定义。例如,如果您有一个值为 1-4 的类型列,则建议使用这 4 个值的 ENUM。然后您可以选择使用 TINYINT 或 CHAR(1),因为它们占用相同的空间量(1 个字节)。
还有一点需要考虑:既然您正在考虑使用 NoSQL DB,那么您有没有想过以 NoSQL 的方式使用 MyISAM?这是很有可能的。我提到的同一本书的第 175 页建议使用HANDLER 结构来读取没有关系包袱的表。事实上,第175页给出了这个例子:
CREATE TABLE customer_mileage_details
(
customer_id INT NOT NULL,
ff_number CHAR(10) NOT NULL,
transaction_date DATE NOT NULL,
mileage SMALLINT NOT NULL,
INSERT(customer_id),
INSERT (ff_number,transaction_date)
) ENGINE = MYISAM;
Run Code Online (Sandbox Code Playgroud)
该表包含数百万行。假设您需要创建一个具有以下要求的数据分析应用程序:
这些命令允许从表中快速读取:
HANDLER customer_mileage_details OPEN;
HANDLER customer_mileage_details READ ff_number FIRST WHERE ff_number=('aaetm-4441');
HANDLER customer_mileage_details READ NEXT LIMT 10;
HANDLER customer_mileage_details CLOSE;
Run Code Online (Sandbox Code Playgroud)
我希望这能让人深思。请调查一下。
警告
关于我写这篇特别文章的讽刺之处在于,我之前写了一篇关于在 Percona Server 二进制文件中使用 HANDLER 的文章,并认为使用它已经过时了。自从那篇较旧的帖子以来,我从没想过我会写一些东西来支持 HANDLER 结构。我现在站得更正了。
Ric*_*ard 10
我首先想到的是我熟悉的特定 RDBMS。但是,我承认它可能不是此应用程序的最佳选择。
因此,我的建议是使用您熟悉的数据库。如果您熟悉 Redis 或 MongoDB,请选择其中之一。如果您更熟悉 SQLite,请选择它。
在这种规模的数据库上,一切都会很快。即使是磁盘较多的数据库也会使用某种缓存,这样磁盘速度就不会成为太大的问题。