如果您不关心关系逻辑,想要真正的快速读取速度,并且您愿意使用RDBMS,我会冒昧地说MySQL。为什么???
MyISAM存储引擎具有一个选项,可以允许扩展表的物理结构以获得更好的性能。那是什么选择?ALTER TABLE选项ROW_FORMAT。
例如,《MySQL数据库设计和调整》一书建议在第72,73页上使用ROW_FORMAT = FIXED。这将在内部将所有VARCHAR字段转换为CHAR。它将使MyISAM表更大,但是针对它执行的SELECT将更快。我可以亲自证明这一点。我曾经有一张1.9GB的桌子。我使用ALTER TABLE tblname ROW_FORMAT = FIXED更改了格式。该表最终为3.7GB。SELECT的速度提高了20-25%,而没有改善或更改任何其他内容。
如果您已经有一个用数据填充的MyISAM表,该怎么办?您可以基于MyISAM表中存在的数据获取建议的列定义的指标。什么查询显示这些指标?
SELECT * FROM tblname PROCEDURE ANALYSE();
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;
该表包含数百万行。假设您需要创建一个具有以下要求的数据分析应用程序:
- 它需要尽快检索信息块。
- 根据用户输入或其他因素,它很可能在表中“跳来跳去”。
- 它与并发或其他数据完整性问题无关。
- 不需要跨应用程序表锁定。
这些命令允许从表中快速读取内容:
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;
我希望这能引起大家的思考。请调查一下。
警告
具有讽刺意味的是,我写这篇特别的文章是我写了一篇有关Permana Server二进制文件中使用的HANDLER的早期文章,并认为使用它已过时。从那篇较早的文章开始,我从未想过我会写任何东西来支持HANDLER结构。我现在纠正了。